<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>hand_eye_calibration [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_calibration.html">Calibration</a> / <a href="toc_calibration_handeye.html">Hand-Eye</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">hand_eye_calibration</span><span data-if="c" style="display:none;">T_hand_eye_calibration</span><span data-if="cpp" style="display:none;">HandEyeCalibration</span><span data-if="dotnet" style="display:none;">HandEyeCalibration</span><span data-if="python" style="display:none;">hand_eye_calibration</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">hand_eye_calibration</span><span data-if="c" style="display:none;">T_hand_eye_calibration</span><span data-if="cpp" style="display:none;">HandEyeCalibration</span><span data-if="dotnet" style="display:none;">HandEyeCalibration</span><span data-if="python" style="display:none;">hand_eye_calibration</span></code> — Perform a hand-eye calibration.</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>hand_eye_calibration</b>( :  : <a href="#X"><i>X</i></a>, <a href="#Y"><i>Y</i></a>, <a href="#Z"><i>Z</i></a>, <a href="#Row"><i>Row</i></a>, <a href="#Col"><i>Col</i></a>, <a href="#NumPoints"><i>NumPoints</i></a>, <a href="#RobotPoses"><i>RobotPoses</i></a>, <a href="#CameraParam"><i>CameraParam</i></a>, <a href="#Method"><i>Method</i></a>, <a href="#QualityType"><i>QualityType</i></a> : <a href="#CameraPose"><i>CameraPose</i></a>, <a href="#CalibrationPose"><i>CalibrationPose</i></a>, <a href="#Quality"><i>Quality</i></a>)</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>T_hand_eye_calibration</b>(const Htuple <a href="#X"><i>X</i></a>, const Htuple <a href="#Y"><i>Y</i></a>, const Htuple <a href="#Z"><i>Z</i></a>, const Htuple <a href="#Row"><i>Row</i></a>, const Htuple <a href="#Col"><i>Col</i></a>, const Htuple <a href="#NumPoints"><i>NumPoints</i></a>, const Htuple <a href="#RobotPoses"><i>RobotPoses</i></a>, const Htuple <a href="#CameraParam"><i>CameraParam</i></a>, const Htuple <a href="#Method"><i>Method</i></a>, const Htuple <a href="#QualityType"><i>QualityType</i></a>, Htuple* <a href="#CameraPose"><i>CameraPose</i></a>, Htuple* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, Htuple* <a href="#Quality"><i>Quality</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HTuple&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HTuple&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const HTuple&amp; <a href="#Method"><i>Method</i></a>, const HTuple&amp; <a href="#QualityType"><i>QualityType</i></a>, HTuple* <a href="#CameraPose"><i>CameraPose</i></a>, HTuple* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, HTuple* <a href="#Quality"><i>Quality</i></a>)</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HString&amp; <a href="#Method"><i>Method</i></a>, const HTuple&amp; <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, HTuple* <a href="#Quality"><i>Quality</i></a>) const</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HString&amp; <a href="#Method"><i>Method</i></a>, const HString&amp; <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>) const</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const char* <a href="#Method"><i>Method</i></a>, const char* <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>) const</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const wchar_t* <a href="#Method"><i>Method</i></a>, const wchar_t* <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const HString&amp; <a href="#Method"><i>Method</i></a>, const HTuple&amp; <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, HTuple* <a href="#Quality"><i>Quality</i></a>)</code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const HString&amp; <a href="#Method"><i>Method</i></a>, const HString&amp; <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>)</code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const char* <a href="#Method"><i>Method</i></a>, const char* <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>)</code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>::<b>HandEyeCalibration</b>(const HTuple&amp; <a href="#X"><i>X</i></a>, const HTuple&amp; <a href="#Y"><i>Y</i></a>, const HTuple&amp; <a href="#Z"><i>Z</i></a>, const HTuple&amp; <a href="#Row"><i>Row</i></a>, const HTuple&amp; <a href="#Col"><i>Col</i></a>, const HTuple&amp; <a href="#NumPoints"><i>NumPoints</i></a>, const HPoseArray&amp; <a href="#RobotPoses"><i>RobotPoses</i></a>, const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const wchar_t* <a href="#Method"><i>Method</i></a>, const wchar_t* <a href="#QualityType"><i>QualityType</i></a>, HPose* <a href="#CalibrationPose"><i>CalibrationPose</i></a>, double* <a href="#Quality"><i>Quality</i></a>)  <span class="signnote">
            (
            Windows only)
          </span></code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>HandEyeCalibration</b>(<a href="HTuple.html">HTuple</a> <a href="#X"><i>x</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Y"><i>y</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Z"><i>z</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Row"><i>row</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Col"><i>col</i></a>, <a href="HTuple.html">HTuple</a> <a href="#NumPoints"><i>numPoints</i></a>, <a href="HTuple.html">HTuple</a> <a href="#RobotPoses"><i>robotPoses</i></a>, <a href="HTuple.html">HTuple</a> <a href="#CameraParam"><i>cameraParam</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Method"><i>method</i></a>, <a href="HTuple.html">HTuple</a> <a href="#QualityType"><i>qualityType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#CameraPose"><i>cameraPose</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#CalibrationPose"><i>calibrationPose</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Quality"><i>quality</i></a>)</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>.<b>HandEyeCalibration</b>(<a href="HTuple.html">HTuple</a> <a href="#X"><i>x</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Y"><i>y</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Z"><i>z</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Row"><i>row</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Col"><i>col</i></a>, <a href="HTuple.html">HTuple</a> <a href="#NumPoints"><i>numPoints</i></a>, <a href="HPose.html">HPose[]</a> <a href="#RobotPoses"><i>robotPoses</i></a>, string <a href="#Method"><i>method</i></a>, <a href="HTuple.html">HTuple</a> <a href="#QualityType"><i>qualityType</i></a>, out <a href="HPose.html">HPose</a> <a href="#CalibrationPose"><i>calibrationPose</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Quality"><i>quality</i></a>)</code></p>
<p>
<code><a href="HPose.html">HPose</a> <a href="HCamPar.html">HCamPar</a>.<b>HandEyeCalibration</b>(<a href="HTuple.html">HTuple</a> <a href="#X"><i>x</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Y"><i>y</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Z"><i>z</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Row"><i>row</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Col"><i>col</i></a>, <a href="HTuple.html">HTuple</a> <a href="#NumPoints"><i>numPoints</i></a>, <a href="HPose.html">HPose[]</a> <a href="#RobotPoses"><i>robotPoses</i></a>, string <a href="#Method"><i>method</i></a>, string <a href="#QualityType"><i>qualityType</i></a>, out <a href="HPose.html">HPose</a> <a href="#CalibrationPose"><i>calibrationPose</i></a>, out double <a href="#Quality"><i>quality</i></a>)</code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>.<b>HandEyeCalibration</b>(<a href="HTuple.html">HTuple</a> <a href="#X"><i>x</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Y"><i>y</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Z"><i>z</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Row"><i>row</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Col"><i>col</i></a>, <a href="HTuple.html">HTuple</a> <a href="#NumPoints"><i>numPoints</i></a>, <a href="HPose.html">HPose[]</a> <a href="#RobotPoses"><i>robotPoses</i></a>, <a href="HCamPar.html">HCamPar</a> <a href="#CameraParam"><i>cameraParam</i></a>, string <a href="#Method"><i>method</i></a>, <a href="HTuple.html">HTuple</a> <a href="#QualityType"><i>qualityType</i></a>, out <a href="HPose.html">HPose</a> <a href="#CalibrationPose"><i>calibrationPose</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Quality"><i>quality</i></a>)</code></p>
<p>
<code>static <a href="HPose.html">HPose</a> <a href="HPose.html">HPose</a>.<b>HandEyeCalibration</b>(<a href="HTuple.html">HTuple</a> <a href="#X"><i>x</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Y"><i>y</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Z"><i>z</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Row"><i>row</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Col"><i>col</i></a>, <a href="HTuple.html">HTuple</a> <a href="#NumPoints"><i>numPoints</i></a>, <a href="HPose.html">HPose[]</a> <a href="#RobotPoses"><i>robotPoses</i></a>, <a href="HCamPar.html">HCamPar</a> <a href="#CameraParam"><i>cameraParam</i></a>, string <a href="#Method"><i>method</i></a>, string <a href="#QualityType"><i>qualityType</i></a>, out <a href="HPose.html">HPose</a> <a href="#CalibrationPose"><i>calibrationPose</i></a>, out double <a href="#Quality"><i>quality</i></a>)</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>hand_eye_calibration</b>(<a href="#X"><i>x</i></a>: Sequence[Union[float, int]], <a href="#Y"><i>y</i></a>: Sequence[Union[float, int]], <a href="#Z"><i>z</i></a>: Sequence[Union[float, int]], <a href="#Row"><i>row</i></a>: Sequence[Union[float, int]], <a href="#Col"><i>col</i></a>: Sequence[Union[float, int]], <a href="#NumPoints"><i>num_points</i></a>: Sequence[int], <a href="#RobotPoses"><i>robot_poses</i></a>: Sequence[Union[int, float]], <a href="#CameraParam"><i>camera_param</i></a>: Sequence[Union[int, float, str]], <a href="#Method"><i>method</i></a>: str, <a href="#QualityType"><i>quality_type</i></a>: MaybeSequence[str]) -&gt; Tuple[Sequence[Union[int, float]], Sequence[Union[int, float]], Sequence[float]]</code></p>
<p>
<code>def <b>hand_eye_calibration_s</b>(<a href="#X"><i>x</i></a>: Sequence[Union[float, int]], <a href="#Y"><i>y</i></a>: Sequence[Union[float, int]], <a href="#Z"><i>z</i></a>: Sequence[Union[float, int]], <a href="#Row"><i>row</i></a>: Sequence[Union[float, int]], <a href="#Col"><i>col</i></a>: Sequence[Union[float, int]], <a href="#NumPoints"><i>num_points</i></a>: Sequence[int], <a href="#RobotPoses"><i>robot_poses</i></a>: Sequence[Union[int, float]], <a href="#CameraParam"><i>camera_param</i></a>: Sequence[Union[int, float, str]], <a href="#Method"><i>method</i></a>: str, <a href="#QualityType"><i>quality_type</i></a>: MaybeSequence[str]) -&gt; Tuple[Sequence[Union[int, float]], Sequence[Union[int, float]], float]</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p>该算子 <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> determines the 3D pose of a robot
(“hand”) relative to a camera (“eye”).  With this information, the
results of image processing can be transformed into the coordinate system of
the robot which can then, e.g., grasp an inspected part.
Please note that 该算子 <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> does not support
3D sensors. A hand-eye calibration including 3D sensors is only supported
by 该算子 <a href="calibrate_hand_eye.html"><code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code></a>. That operator furthermore
provides a more user-friendly interface to the hand-eye calibration than the
operator <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code>, since the reference coordinate
systems are explicitly indicated.
</p>
<p>There are two possible configurations of robot-camera (hand-eye) systems:
The camera can be mounted on the robot or be stationary and observe the
robot. Note that the term robot is used in place for a mechanism that moves
objects. Thus, you can use <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> to calibrate many
different systems, from pan-tilt heads to multi-axis manipulators.
</p>
<p>In essence, systems suitable for hand-eye calibration are described by a
closed chain of four Euclidean transformations. In this chain two
non-consecutive transformations are either known from the robot controller
or computed from calibration points seen by a camera system. The two other
constant transformations are computed by the hand-eye calibration procedure.
</p>
<p>A hand-eye calibration is performed similarly to the calibration of the
external camera parameters (see <a href="camera_calibration.html"><code><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></code></a>): You acquire a
set of images of a calibration object, determine correspondences between
known calibration points and their projection in the images and pass them to
<code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> via the parameters <a href="#X"><i><code><span data-if="hdevelop" style="display:inline">X</span><span data-if="c" style="display:none">X</span><span data-if="cpp" style="display:none">X</span><span data-if="com" style="display:none">X</span><span data-if="dotnet" style="display:none">x</span><span data-if="python" style="display:none">x</span></code></i></a>, <a href="#Y"><i><code><span data-if="hdevelop" style="display:inline">Y</span><span data-if="c" style="display:none">Y</span><span data-if="cpp" style="display:none">Y</span><span data-if="com" style="display:none">Y</span><span data-if="dotnet" style="display:none">y</span><span data-if="python" style="display:none">y</span></code></i></a>,
<a href="#Z"><i><code><span data-if="hdevelop" style="display:inline">Z</span><span data-if="c" style="display:none">Z</span><span data-if="cpp" style="display:none">Z</span><span data-if="com" style="display:none">Z</span><span data-if="dotnet" style="display:none">z</span><span data-if="python" style="display:none">z</span></code></i></a>, <a href="#Row"><i><code><span data-if="hdevelop" style="display:inline">Row</span><span data-if="c" style="display:none">Row</span><span data-if="cpp" style="display:none">Row</span><span data-if="com" style="display:none">Row</span><span data-if="dotnet" style="display:none">row</span><span data-if="python" style="display:none">row</span></code></i></a>, <a href="#Col"><i><code><span data-if="hdevelop" style="display:inline">Col</span><span data-if="c" style="display:none">Col</span><span data-if="cpp" style="display:none">Col</span><span data-if="com" style="display:none">Col</span><span data-if="dotnet" style="display:none">col</span><span data-if="python" style="display:none">col</span></code></i></a>, and <a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a>. If
you use the standard calibration plate, the correspondences can be determined
very easily with 该算子s <a href="find_caltab.html"><code><span data-if="hdevelop" style="display:inline">find_caltab</span><span data-if="c" style="display:none">find_caltab</span><span data-if="cpp" style="display:none">FindCaltab</span><span data-if="com" style="display:none">FindCaltab</span><span data-if="dotnet" style="display:none">FindCaltab</span><span data-if="python" style="display:none">find_caltab</span></code></a> and
<a href="find_marks_and_pose.html"><code><span data-if="hdevelop" style="display:inline">find_marks_and_pose</span><span data-if="c" style="display:none">find_marks_and_pose</span><span data-if="cpp" style="display:none">FindMarksAndPose</span><span data-if="com" style="display:none">FindMarksAndPose</span><span data-if="dotnet" style="display:none">FindMarksAndPose</span><span data-if="python" style="display:none">find_marks_and_pose</span></code></a>. Furthermore, the camera is identical for
the complete calibration sequence and is specified by the internal camera
parameters in <a href="#CameraParam"><i><code><span data-if="hdevelop" style="display:inline">CameraParam</span><span data-if="c" style="display:none">CameraParam</span><span data-if="cpp" style="display:none">CameraParam</span><span data-if="com" style="display:none">CameraParam</span><span data-if="dotnet" style="display:none">cameraParam</span><span data-if="python" style="display:none">camera_param</span></code></i></a>. The internal camera parameters are
calibrated beforehand deploying 该算子 <a href="calibrate_cameras.html"><code><span data-if="hdevelop" style="display:inline">calibrate_cameras</span><span data-if="c" style="display:none">calibrate_cameras</span><span data-if="cpp" style="display:none">CalibrateCameras</span><span data-if="com" style="display:none">CalibrateCameras</span><span data-if="dotnet" style="display:none">CalibrateCameras</span><span data-if="python" style="display:none">calibrate_cameras</span></code></a> or
<a href="camera_calibration.html"><code><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></code></a>.
</p>
<p>In contrast to the camera calibration, the calibration object is not moved
manually. This task is delegated to the robot, which either moves the camera
(mounted camera) or the calibration object (stationary camera). The robot's
movements are assumed to be known and therefore are also used as an input for
the calibration (parameter <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>).
</p>
<p>The output of <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> are the two poses
<a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a> and <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>. Their pose type is
identical to the pose type of the first input robot pose.
</p>
<p>Basically, two hand-eye configurations can be distinguished and are
discussed in more detail below, followed by general information about the
process of hand-eye calibration.
</p>
<h3>Moving camera (mounted on a robot)</h3>
<p>In this configuration, the calibration object remains stationary and the
camera is moved to different positions by the robot. The main idea behind the
hand-eye calibration is that the information extracted from a calibration
image, i.e., the pose of the calibration object relative to the camera (i.e.,
the external camera parameters), can be seen as a chain of poses or
homogeneous transformation matrices, from the calibration object via the base
of the robot to its tool (end-effector) and finally to the camera:
</p>
<p><span class="pre">
  Moving camera:     cam_H_cal = cam_H_tool * tool_H_base * base_H_cal
                                     |             |             |
                                 <a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a>     <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>   <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>
</span>
</p>
<p>From the set of calibration images, 该算子 <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code>
determines the two transformations at the ends of the chain, i.e., the pose
of the robot tool in camera coordinates
(<span title="1" style="vertical-align:-0.217917em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.05977em" height="1.01195em" viewBox="0 0 64.956390 16.191269">
<!-- Original BoundingBox: -32.478195 -8.095642 32.478195 8.095627 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_109">
      <path style="fill-rule: evenodd;" d="M434.000000 -81.000000C429.000000 -61.000000,420.000000 -27.000000,420.000000 -22.000000C420.000000 -0.000000,438.000000 10.000000,454.000000 10.000000C472.000000 10.000000,488.000000 -3.000000,493.000000 -12.000000C498.000000 -21.000000,506.000000 -53.000000,511.000000 -74.000000C516.000000 -93.000000,527.000000 -139.000000,533.000000 -164.000000C539.000000 -186.000000,545.000000 -208.000000,550.000000 -231.000000C561.000000 -274.000000,561.000000 -276.000000,581.000000 -307.000000C613.000000 -356.000000,663.000000 -413.000000,741.000000 -413.000000C797.000000 -413.000000,800.000000 -367.000000,800.000000 -343.000000C800.000000 -283.000000,757.000000 -172.000000,741.000000 -130.000000C730.000000 -102.000000,726.000000 -93.000000,726.000000 -76.000000C726.000000 -23.000000,770.000000 10.000000,821.000000 10.000000C921.000000 10.000000,965.000000 -128.000000,965.000000 -143.000000C965.000000 -156.000000,952.000000 -156.000000,949.000000 -156.000000C935.000000 -156.000000,934.000000 -150.000000,930.000000 -139.000000C907.000000 -59.000000,864.000000 -18.000000,824.000000 -18.000000C803.000000 -18.000000,799.000000 -32.000000,799.000000 -53.000000C799.000000 -76.000000,804.000000 -89.000000,822.000000 -134.000000C834.000000 -165.000000,875.000000 -271.000000,875.000000 -327.000000C875.000000 -343.000000,875.000000 -385.000000,838.000000 -414.000000C821.000000 -427.000000,792.000000 -441.000000,745.000000 -441.000000C655.000000 -441.000000,600.000000 -382.000000,568.000000 -340.000000C560.000000 -425.000000,489.000000 -441.000000,438.000000 -441.000000C355.000000 -441.000000,299.000000 -390.000000,269.000000 -350.000000C262.000000 -419.000000,203.000000 -441.000000,162.000000 -441.000000C119.000000 -441.000000,96.000000 -410.000000,83.000000 -387.000000C61.000000 -350.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -364.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C164.000000 10.000000,180.000000 -3.000000,185.000000 -12.000000C190.000000 -21.000000,198.000000 -53.000000,203.000000 -74.000000C208.000000 -93.000000,219.000000 -139.000000,225.000000 -164.000000C231.000000 -186.000000,237.000000 -208.000000,242.000000 -231.000000C253.000000 -272.000000,255.000000 -280.000000,284.000000 -321.000000C312.000000 -361.000000,359.000000 -413.000000,434.000000 -413.000000C492.000000 -413.000000,493.000000 -362.000000,493.000000 -343.000000C493.000000 -318.000000,490.000000 -305.000000,476.000000 -249.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.537796 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,7.158478 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_109" x="4.337713"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.181259 12.704590)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.527542 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,46.001495 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
</svg></span>,<a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a>) and
the pose of the calibration object in the robot base coordinate system
(<span title="2" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="3.83138em" height="1.19599em" viewBox="0 0 61.302155 19.135910">
<!-- Original BoundingBox: -30.651077 -9.567963 30.651077 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.364914 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,7.101273 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.877029 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,41.223145 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,47.843979 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="4.337713"></use>
  </g>
</svg></span>,<a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>).
</p>
<p>In contrast, the transformation in the middle of the chain,
<span title="3" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.11405em" height="1.19599em" viewBox="0 0 65.824875 19.135910">
<!-- Original BoundingBox: -32.912445 -9.567963 32.912430 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.103546 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,5.577499 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,23.054199 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,37.400345 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,44.136841 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
</svg></span>, is known but changes for each
calibration image, because it describes the pose of the robot moving the
camera, or to be more exact its inverse pose (pose of the base coordinate
system in robot tool coordinates). You must specify the inverse robot poses
in the calibration images in the parameter <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>.
</p>
<p>Note that when calibrating SCARA robots it is not possible to
determine the Z translation of <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>. To eliminate
this ambiguity the Z translation of <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a> is internally
set to 0.0 and the <a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a> is calculated accordingly.
It is necessary to determine the true translation in Z after
the calibration (see <a href="calibrate_hand_eye.html"><code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code></a>).
</p>
<h3>Stationary camera</h3>
<p>In this configuration, the robot grasps the calibration object and moves
it in front of the camera. Again, the information extracted from a
calibration image, i.e., the pose of the calibration object in camera
coordinates (the external camera parameters), are equal to a chain of
poses or homogeneous transformation matrices, this time from the
calibration object via the robot's tool to its base and finally to
the camera:
</p>
<p><span class="pre">
  Stationary camera:  cam_H_cal = cam_H_base * base_H_tool * tool_H_cal
                                      |             |             |
                                  <a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a>     <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>   <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>
</span>
</p>
<p>Analogously to the configuration with a moving camera, 该算子
<code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> determines the two transformations at the ends
of the chain, here the pose of the robot base coordinate system in camera
coordinates
(<span title="4" style="vertical-align:-0.217917em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.28237em" height="1.01195em" viewBox="0 0 68.517853 16.191269">
<!-- Original BoundingBox: -34.258926 -8.095642 34.258926 8.095627 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_109">
      <path style="fill-rule: evenodd;" d="M434.000000 -81.000000C429.000000 -61.000000,420.000000 -27.000000,420.000000 -22.000000C420.000000 -0.000000,438.000000 10.000000,454.000000 10.000000C472.000000 10.000000,488.000000 -3.000000,493.000000 -12.000000C498.000000 -21.000000,506.000000 -53.000000,511.000000 -74.000000C516.000000 -93.000000,527.000000 -139.000000,533.000000 -164.000000C539.000000 -186.000000,545.000000 -208.000000,550.000000 -231.000000C561.000000 -274.000000,561.000000 -276.000000,581.000000 -307.000000C613.000000 -356.000000,663.000000 -413.000000,741.000000 -413.000000C797.000000 -413.000000,800.000000 -367.000000,800.000000 -343.000000C800.000000 -283.000000,757.000000 -172.000000,741.000000 -130.000000C730.000000 -102.000000,726.000000 -93.000000,726.000000 -76.000000C726.000000 -23.000000,770.000000 10.000000,821.000000 10.000000C921.000000 10.000000,965.000000 -128.000000,965.000000 -143.000000C965.000000 -156.000000,952.000000 -156.000000,949.000000 -156.000000C935.000000 -156.000000,934.000000 -150.000000,930.000000 -139.000000C907.000000 -59.000000,864.000000 -18.000000,824.000000 -18.000000C803.000000 -18.000000,799.000000 -32.000000,799.000000 -53.000000C799.000000 -76.000000,804.000000 -89.000000,822.000000 -134.000000C834.000000 -165.000000,875.000000 -271.000000,875.000000 -327.000000C875.000000 -343.000000,875.000000 -385.000000,838.000000 -414.000000C821.000000 -427.000000,792.000000 -441.000000,745.000000 -441.000000C655.000000 -441.000000,600.000000 -382.000000,568.000000 -340.000000C560.000000 -425.000000,489.000000 -441.000000,438.000000 -441.000000C355.000000 -441.000000,299.000000 -390.000000,269.000000 -350.000000C262.000000 -419.000000,203.000000 -441.000000,162.000000 -441.000000C119.000000 -441.000000,96.000000 -410.000000,83.000000 -387.000000C61.000000 -350.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -364.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C164.000000 10.000000,180.000000 -3.000000,185.000000 -12.000000C190.000000 -21.000000,198.000000 -53.000000,203.000000 -74.000000C208.000000 -93.000000,219.000000 -139.000000,225.000000 -164.000000C231.000000 -186.000000,237.000000 -208.000000,242.000000 -231.000000C253.000000 -272.000000,255.000000 -280.000000,284.000000 -321.000000C312.000000 -361.000000,359.000000 -413.000000,434.000000 -413.000000C492.000000 -413.000000,493.000000 -362.000000,493.000000 -343.000000C493.000000 -318.000000,490.000000 -305.000000,476.000000 -249.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.757065 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,7.377747 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_109" x="4.337713"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.400528 12.704590)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.746811 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,47.483170 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
</svg></span>,<a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a>)
and the pose of the calibration object relative to the robot tool
(<span title="5" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="3.6088em" height="1.19599em" viewBox="0 0 57.740860 19.135910">
<!-- Original BoundingBox: -28.870438 -9.567963 28.870422 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.145554 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,5.619507 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,23.096207 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,37.442352 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,44.063171 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="4.337713"></use>
  </g>
</svg></span>,<a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>).
</p>
<p>The transformation in the middle of the chain,
<span title="6" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.11405em" height="1.19599em" viewBox="0 0 65.824875 19.135910">
<!-- Original BoundingBox: -32.912445 -9.567963 32.912430 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.103546 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,6.839905 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.615662 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.961777 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,46.435730 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
</svg></span>, describes the pose of the
robot moving the calibration object, i.e., the pose of the tool relative to
the base coordinate system. You must specify the robot poses in the
calibration images in the parameter <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>.
</p>
<p>Note that when calibrating SCARA robots it is not possible to
determine the Z translation of <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a>. To eliminate
this ambiguity the Z translation of <a href="#CalibrationPose"><i><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></i></a> is internally
set to 0.0 and the <a href="#CameraPose"><i><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></i></a> is calculated accordingly.
It is necessary to determine the true translation in Z after
the calibration (see <a href="calibrate_hand_eye.html"><code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code></a>).
</p>
<h3>Additional information about the calibration process</h3>
<p>The following sections discuss individual questions arising from the
use of <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code>. They are intended to be a guideline
for using 该算子 in an application, as well as to help
understanding 该算子.
</p>
<dl class="generic">

<dt><b>How do I get 3D calibration points and their projections?</b></dt>
<dd>


<p>3D calibration points given in the world coordinate system (<a href="#X"><i><code><span data-if="hdevelop" style="display:inline">X</span><span data-if="c" style="display:none">X</span><span data-if="cpp" style="display:none">X</span><span data-if="com" style="display:none">X</span><span data-if="dotnet" style="display:none">x</span><span data-if="python" style="display:none">x</span></code></i></a>,
<a href="#Y"><i><code><span data-if="hdevelop" style="display:inline">Y</span><span data-if="c" style="display:none">Y</span><span data-if="cpp" style="display:none">Y</span><span data-if="com" style="display:none">Y</span><span data-if="dotnet" style="display:none">y</span><span data-if="python" style="display:none">y</span></code></i></a>, <a href="#Z"><i><code><span data-if="hdevelop" style="display:inline">Z</span><span data-if="c" style="display:none">Z</span><span data-if="cpp" style="display:none">Z</span><span data-if="com" style="display:none">Z</span><span data-if="dotnet" style="display:none">z</span><span data-if="python" style="display:none">z</span></code></i></a>) and their associated projections in the image
(<a href="#Row"><i><code><span data-if="hdevelop" style="display:inline">Row</span><span data-if="c" style="display:none">Row</span><span data-if="cpp" style="display:none">Row</span><span data-if="com" style="display:none">Row</span><span data-if="dotnet" style="display:none">row</span><span data-if="python" style="display:none">row</span></code></i></a>, <a href="#Col"><i><code><span data-if="hdevelop" style="display:inline">Col</span><span data-if="c" style="display:none">Col</span><span data-if="cpp" style="display:none">Col</span><span data-if="com" style="display:none">Col</span><span data-if="dotnet" style="display:none">col</span><span data-if="python" style="display:none">col</span></code></i></a>) form the basis of the hand-eye calibration.
In order to be able to perform a successful hand-eye calibration, you need
at least three images of the 3D calibration points that were obtained under
different poses of the manipulator. In each image at least four points must
be available, in order to compute internally the pose transferring the
calibration points from their world coordinate system into the camera
coordinate system.
</p>
<p>In principle, you can use arbitrary known points for the calibration.
However, it is usually most convenient to use the standard calibration plate,
e.g., the one that can be generated with <a href="gen_caltab.html"><code><span data-if="hdevelop" style="display:inline">gen_caltab</span><span data-if="c" style="display:none">gen_caltab</span><span data-if="cpp" style="display:none">GenCaltab</span><span data-if="com" style="display:none">GenCaltab</span><span data-if="dotnet" style="display:none">GenCaltab</span><span data-if="python" style="display:none">gen_caltab</span></code></a>.  In this
case, you can use 该算子s <a href="find_caltab.html"><code><span data-if="hdevelop" style="display:inline">find_caltab</span><span data-if="c" style="display:none">find_caltab</span><span data-if="cpp" style="display:none">FindCaltab</span><span data-if="com" style="display:none">FindCaltab</span><span data-if="dotnet" style="display:none">FindCaltab</span><span data-if="python" style="display:none">find_caltab</span></code></a> and
<a href="find_marks_and_pose.html"><code><span data-if="hdevelop" style="display:inline">find_marks_and_pose</span><span data-if="c" style="display:none">find_marks_and_pose</span><span data-if="cpp" style="display:none">FindMarksAndPose</span><span data-if="com" style="display:none">FindMarksAndPose</span><span data-if="dotnet" style="display:none">FindMarksAndPose</span><span data-if="python" style="display:none">find_marks_and_pose</span></code></a> to extract the position of the calibration plate
and of the calibration marks and 该算子 <a href="caltab_points.html"><code><span data-if="hdevelop" style="display:inline">caltab_points</span><span data-if="c" style="display:none">caltab_points</span><span data-if="cpp" style="display:none">CaltabPoints</span><span data-if="com" style="display:none">CaltabPoints</span><span data-if="dotnet" style="display:none">CaltabPoints</span><span data-if="python" style="display:none">caltab_points</span></code></a> to read
the 3D coordinates of the calibration marks (see also the description of
<a href="camera_calibration.html"><code><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></code></a>).
</p>
<p>The parameter <a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a> specifies the number of 3D calibration
points used for each pose of the manipulator, i.e., for each image.
With this, the 3D calibration points which are stored in a linearized
fashion in <a href="#X"><i><code><span data-if="hdevelop" style="display:inline">X</span><span data-if="c" style="display:none">X</span><span data-if="cpp" style="display:none">X</span><span data-if="com" style="display:none">X</span><span data-if="dotnet" style="display:none">x</span><span data-if="python" style="display:none">x</span></code></i></a>, <a href="#Y"><i><code><span data-if="hdevelop" style="display:inline">Y</span><span data-if="c" style="display:none">Y</span><span data-if="cpp" style="display:none">Y</span><span data-if="com" style="display:none">Y</span><span data-if="dotnet" style="display:none">y</span><span data-if="python" style="display:none">y</span></code></i></a>, <a href="#Z"><i><code><span data-if="hdevelop" style="display:inline">Z</span><span data-if="c" style="display:none">Z</span><span data-if="cpp" style="display:none">Z</span><span data-if="com" style="display:none">Z</span><span data-if="dotnet" style="display:none">z</span><span data-if="python" style="display:none">z</span></code></i></a>, and their corresponding
projections (<a href="#Row"><i><code><span data-if="hdevelop" style="display:inline">Row</span><span data-if="c" style="display:none">Row</span><span data-if="cpp" style="display:none">Row</span><span data-if="com" style="display:none">Row</span><span data-if="dotnet" style="display:none">row</span><span data-if="python" style="display:none">row</span></code></i></a>, <a href="#Col"><i><code><span data-if="hdevelop" style="display:inline">Col</span><span data-if="c" style="display:none">Col</span><span data-if="cpp" style="display:none">Col</span><span data-if="com" style="display:none">Col</span><span data-if="dotnet" style="display:none">col</span><span data-if="python" style="display:none">col</span></code></i></a>) can be associated with the
corresponding pose of the manipulator (<a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a>). Note that
in contrast to 该算子 <a href="camera_calibration.html"><code><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></code></a> the 3D coordinates
of the calibration points must be specified for each calibration image,
not only once, and thus can vary for each image of the sequence.
</p>
</dd>

<dt><b>How do I acquire a suitable set of images?</b></dt>
<dd>


<p>The following conditions, especially if using a standard calibration plate,
should be considered:
</p>
<ul>
<li>
<p>
The position of the calibration marks (moving camera: relative to the
robot's base; stationary camera: relative to the robot's tool) and
the position of the camera (moving camera: relative to the
robot's tool; stationary camera: relative to the robot's base)
must not be changed between the images.
</p>
</li>
<li>
<p>
The internal camera parameters (<a href="#CameraParam"><i><code><span data-if="hdevelop" style="display:inline">CameraParam</span><span data-if="c" style="display:none">CameraParam</span><span data-if="cpp" style="display:none">CameraParam</span><span data-if="com" style="display:none">CameraParam</span><span data-if="dotnet" style="display:none">cameraParam</span><span data-if="python" style="display:none">camera_param</span></code></i></a>) must be
constant and must be determined in a previous camera calibration step
(see <a href="camera_calibration.html"><code><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></code></a>). Note that changes of the image size,
the focal length, the aperture, or the focus cause a change of the
internal camera parameters.
</p>
</li>
<li>
<p>
The theoretical lower limit of the number of image to acquire is three.
Nevertheless, it is recommended to have 10 or more images at hand, in
which the position of the camera or the robot hand are
sufficiently different.
</p>
<p>For articulated (i.e., non-SCARA) robots the amount of rotation between
the images is essential and should be at least 30 degrees or better
60 degrees. The rotations between the images must exhibit at least
two different axes of rotation. Very different orientations lead to
precise calibration results. For SCARA robots there is only one
axis of rotation. The amount of rotation between the images should also
be large.
</p>
</li>
<li>
<p>
In each image, the calibration plate must be completely visible
(including its border).
</p>
</li>
<li>
<p>
Reflections or other disturbances should not impair the detection of the
calibration plate and its calibration marks.
</p>
</li>
<li>
<p>
If individual calibration marks instead of the standard
calibration plate are used at least four marks must be present in
each image.
</p>
</li>
<li>
<p>
In each image, the calibration plate should at least fill one
quarter of the entire image for a precise computation of the
calibration to camera transformation, which is performed internally
during hand-eye calibration.
</p>
</li>
<li>
<p>
As mentioned, the camera must not be modified between the acquisition of
the individual images. Please make sure that the focus is sufficient for
the expected changes of the camera to calibration plate distance.
Therefore, bright lighting conditions for the calibration plate are
important, because then you can use smaller apertures, which result in
a larger depth of focus.
</p>
</li>
</ul>

</dd>

<dt><b>How do I obtain the poses of the robot?</b></dt>
<dd>


<p>In the parameter <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a> you must pass the poses of the robot in
the calibration images (moving camera: pose of the robot base in robot tool
coordinates; stationary camera: pose of the robot tool in robot base
coordinates) in a linearized fashion.  We recommend to create the robot poses
in a separate program and save in files using <a href="write_pose.html"><code><span data-if="hdevelop" style="display:inline">write_pose</span><span data-if="c" style="display:none">write_pose</span><span data-if="cpp" style="display:none">WritePose</span><span data-if="com" style="display:none">WritePose</span><span data-if="dotnet" style="display:none">WritePose</span><span data-if="python" style="display:none">write_pose</span></code></a>. In the
calibration program you can then read and accumulate them in a tuple as shown
in the example program below. In addition, we recommend to save the pose of
the robot tool in robot base coordinates independent of the hand-eye
configuration. When using a moving camera, you then invert the read poses
before accumulating them. This is also shown in the example program.
</p>
<p>Via the Cartesian interface of the robot, you can typically obtain the pose
of the tool in base coordinates in a notation that corresponds to the pose
representations with the codes 0 or 2 (<code><span data-if="hdevelop" style="display:inline">OrderOfRotation</span><span data-if="c" style="display:none">OrderOfRotation</span><span data-if="cpp" style="display:none">OrderOfRotation</span><span data-if="com" style="display:none">OrderOfRotation</span><span data-if="dotnet" style="display:none">orderOfRotation</span><span data-if="python" style="display:none">order_of_rotation</span></code> =
<i><span data-if="hdevelop" style="display:inline">'gba'</span><span data-if="c" style="display:none">"gba"</span><span data-if="cpp" style="display:none">"gba"</span><span data-if="com" style="display:none">"gba"</span><span data-if="dotnet" style="display:none">"gba"</span><span data-if="python" style="display:none">"gba"</span></i> or <i><span data-if="hdevelop" style="display:inline">'abg'</span><span data-if="c" style="display:none">"abg"</span><span data-if="cpp" style="display:none">"abg"</span><span data-if="com" style="display:none">"abg"</span><span data-if="dotnet" style="display:none">"abg"</span><span data-if="python" style="display:none">"abg"</span></i>, see <a href="create_pose.html"><code><span data-if="hdevelop" style="display:inline">create_pose</span><span data-if="c" style="display:none">create_pose</span><span data-if="cpp" style="display:none">CreatePose</span><span data-if="com" style="display:none">CreatePose</span><span data-if="dotnet" style="display:none">CreatePose</span><span data-if="python" style="display:none">create_pose</span></code></a>). In this case, you
can directly use the pose values obtained from the robot as input for
<a href="create_pose.html"><code><span data-if="hdevelop" style="display:inline">create_pose</span><span data-if="c" style="display:none">create_pose</span><span data-if="cpp" style="display:none">CreatePose</span><span data-if="com" style="display:none">CreatePose</span><span data-if="dotnet" style="display:none">CreatePose</span><span data-if="python" style="display:none">create_pose</span></code></a>.
</p>
<p>If the Cartesian interface of your robot describes the orientation in a
different way, e.g., with the representation ZYZ (<span title="7" style="vertical-align:-0.363664em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="11.3141em" height="1.15724em" viewBox="0 0 181.024857 18.515915">
<!-- Original BoundingBox: -90.512436 -9.257965 90.512421 9.257950 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_121">
      <path style="fill-rule: evenodd;" d="M556.000000 -377.000000C560.000000 -391.000000,560.000000 -393.000000,560.000000 -399.000000C560.000000 -419.000000,544.000000 -431.000000,527.000000 -431.000000C516.000000 -431.000000,497.000000 -426.000000,486.000000 -407.000000C483.000000 -401.000000,475.000000 -369.000000,470.000000 -349.000000L449.000000 -266.000000C443.000000 -242.000000,412.000000 -116.000000,409.000000 -105.000000C408.000000 -105.000000,364.000000 -18.000000,286.000000 -18.000000C218.000000 -18.000000,218.000000 -83.000000,218.000000 -101.000000C218.000000 -155.000000,241.000000 -218.000000,271.000000 -295.000000C283.000000 -327.000000,288.000000 -339.000000,288.000000 -356.000000C288.000000 -404.000000,247.000000 -441.000000,193.000000 -441.000000C92.000000 -441.000000,47.000000 -305.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -280.000000,82.000000 -291.000000C107.000000 -374.000000,150.000000 -413.000000,190.000000 -413.000000C207.000000 -413.000000,215.000000 -402.000000,215.000000 -378.000000C215.000000 -355.000000,206.000000 -333.000000,201.000000 -320.000000C153.000000 -198.000000,143.000000 -161.000000,143.000000 -117.000000C143.000000 -100.000000,143.000000 -53.000000,182.000000 -21.000000C213.000000 5.000000,255.000000 10.000000,282.000000 10.000000C322.000000 10.000000,358.000000 -5.000000,391.000000 -35.000000C378.000000 20.000000,367.000000 62.000000,325.000000 112.000000C298.000000 143.000000,258.000000 176.000000,205.000000 176.000000C198.000000 176.000000,151.000000 176.000000,130.000000 143.000000C184.000000 137.000000,184.000000 89.000000,184.000000 88.000000C184.000000 56.000000,155.000000 50.000000,145.000000 50.000000C120.000000 50.000000,87.000000 70.000000,87.000000 116.000000C87.000000 167.000000,135.000000 204.000000,206.000000 204.000000C307.000000 204.000000,430.000000 126.000000,461.000000 1.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_122">
      <path style="fill-rule: evenodd;" d="M168.000000 -88.000000C194.000000 -114.000000,212.000000 -133.000000,297.000000 -201.000000C318.000000 -218.000000,393.000000 -278.000000,422.000000 -306.000000C483.000000 -366.000000,521.000000 -417.000000,521.000000 -429.000000C521.000000 -441.000000,508.000000 -441.000000,504.000000 -441.000000C495.000000 -441.000000,492.000000 -439.000000,487.000000 -431.000000C456.000000 -385.000000,435.000000 -370.000000,411.000000 -370.000000C399.000000 -370.000000,384.000000 -371.000000,354.000000 -400.000000C320.000000 -434.000000,298.000000 -441.000000,275.000000 -441.000000C195.000000 -441.000000,141.000000 -354.000000,141.000000 -324.000000C141.000000 -315.000000,151.000000 -312.000000,158.000000 -312.000000C170.000000 -312.000000,172.000000 -315.000000,176.000000 -326.000000C191.000000 -361.000000,247.000000 -363.000000,263.000000 -363.000000C286.000000 -363.000000,312.000000 -357.000000,326.000000 -354.000000C381.000000 -342.000000,388.000000 -342.000000,413.000000 -342.000000C387.000000 -315.000000,369.000000 -297.000000,274.000000 -221.000000C196.000000 -159.000000,169.000000 -134.000000,150.000000 -114.000000C90.000000 -55.000000,61.000000 -11.000000,61.000000 -2.000000C61.000000 10.000000,74.000000 10.000000,78.000000 10.000000C88.000000 10.000000,90.000000 8.000000,95.000000 -0.000000C122.000000 -38.000000,153.000000 -61.000000,187.000000 -61.000000C199.000000 -61.000000,214.000000 -60.000000,241.000000 -35.000000C272.000000 -5.000000,292.000000 10.000000,324.000000 10.000000C431.000000 10.000000,498.000000 -111.000000,498.000000 -145.000000C498.000000 -157.000000,487.000000 -158.000000,481.000000 -158.000000C469.000000 -158.000000,467.000000 -153.000000,463.000000 -142.000000C444.000000 -92.000000,385.000000 -68.000000,336.000000 -68.000000C313.000000 -68.000000,288.000000 -73.000000,263.000000 -79.000000C217.000000 -89.000000,209.000000 -89.000000,191.000000 -89.000000C189.000000 -89.000000,174.000000 -89.000000,168.000000 -88.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_40">
      <path style="fill-rule: evenodd;" d="M331.000000 240.000000C331.000000 237.000000,331.000000 235.000000,314.000000 218.000000C189.000000 92.000000,157.000000 -97.000000,157.000000 -250.000000C157.000000 -424.000000,195.000000 -598.000000,318.000000 -723.000000C331.000000 -735.000000,331.000000 -737.000000,331.000000 -740.000000C331.000000 -747.000000,327.000000 -750.000000,321.000000 -750.000000C311.000000 -750.000000,221.000000 -682.000000,162.000000 -555.000000C111.000000 -445.000000,99.000000 -334.000000,99.000000 -250.000000C99.000000 -172.000000,110.000000 -51.000000,165.000000 62.000000C225.000000 185.000000,311.000000 250.000000,321.000000 250.000000C327.000000 250.000000,331.000000 247.000000,331.000000 240.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_41">
      <path style="fill-rule: evenodd;" d="M289.000000 -250.000000C289.000000 -328.000000,278.000000 -449.000000,223.000000 -562.000000C163.000000 -685.000000,77.000000 -750.000000,67.000000 -750.000000C61.000000 -750.000000,57.000000 -746.000000,57.000000 -740.000000C57.000000 -737.000000,57.000000 -735.000000,76.000000 -717.000000C174.000000 -618.000000,231.000000 -459.000000,231.000000 -250.000000C231.000000 -79.000000,194.000000 97.000000,70.000000 223.000000C57.000000 235.000000,57.000000 237.000000,57.000000 240.000000C57.000000 246.000000,61.000000 250.000000,67.000000 250.000000C77.000000 250.000000,167.000000 182.000000,226.000000 55.000000C277.000000 -55.000000,289.000000 -166.000000,289.000000 -250.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_49">
      <path style="fill-rule: evenodd;" d="M294.000000 -640.000000C294.000000 -664.000000,294.000000 -666.000000,271.000000 -666.000000C209.000000 -602.000000,121.000000 -602.000000,89.000000 -602.000000L89.000000 -571.000000C109.000000 -571.000000,168.000000 -571.000000,220.000000 -597.000000L220.000000 -79.000000C220.000000 -43.000000,217.000000 -31.000000,127.000000 -31.000000L95.000000 -31.000000L95.000000 -0.000000L257.000000 -0.000000L130.000000 -3.000000L217.000000 -3.000000L257.000000 -3.000000L297.000000 -3.000000L384.000000 -3.000000L419.000000 -0.000000L419.000000 -31.000000L387.000000 -31.000000C297.000000 -31.000000,294.000000 -42.000000,294.000000 -79.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_50">
      <path style="fill-rule: evenodd;" d="M127.000000 -77.000000L233.000000 -180.000000C389.000000 -318.000000,449.000000 -372.000000,449.000000 -472.000000C449.000000 -586.000000,359.000000 -666.000000,237.000000 -666.000000C124.000000 -666.000000,50.000000 -574.000000,50.000000 -485.000000C50.000000 -429.000000,100.000000 -429.000000,103.000000 -429.000000C120.000000 -429.000000,155.000000 -441.000000,155.000000 -482.000000C155.000000 -508.000000,137.000000 -534.000000,102.000000 -534.000000C94.000000 -534.000000,92.000000 -534.000000,89.000000 -533.000000C112.000000 -598.000000,166.000000 -635.000000,224.000000 -635.000000C315.000000 -635.000000,358.000000 -554.000000,358.000000 -472.000000C358.000000 -392.000000,308.000000 -313.000000,253.000000 -251.000000L61.000000 -37.000000C50.000000 -26.000000,50.000000 -24.000000,50.000000 -0.000000L421.000000 -0.000000L449.000000 -174.000000L424.000000 -174.000000C419.000000 -144.000000,412.000000 -100.000000,402.000000 -85.000000C395.000000 -77.000000,329.000000 -77.000000,307.000000 -77.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_51">
      <path style="fill-rule: evenodd;" d="M290.000000 -352.000000C372.000000 -379.000000,430.000000 -449.000000,430.000000 -528.000000C430.000000 -610.000000,342.000000 -666.000000,246.000000 -666.000000C145.000000 -666.000000,69.000000 -606.000000,69.000000 -530.000000C69.000000 -497.000000,91.000000 -478.000000,120.000000 -478.000000C151.000000 -478.000000,171.000000 -500.000000,171.000000 -529.000000C171.000000 -579.000000,124.000000 -579.000000,109.000000 -579.000000C140.000000 -628.000000,206.000000 -641.000000,242.000000 -641.000000C283.000000 -641.000000,338.000000 -619.000000,338.000000 -529.000000C338.000000 -517.000000,336.000000 -459.000000,310.000000 -415.000000C280.000000 -367.000000,246.000000 -364.000000,221.000000 -363.000000C213.000000 -362.000000,189.000000 -360.000000,182.000000 -360.000000C174.000000 -359.000000,167.000000 -358.000000,167.000000 -348.000000C167.000000 -337.000000,174.000000 -337.000000,191.000000 -337.000000L235.000000 -337.000000C317.000000 -337.000000,354.000000 -269.000000,354.000000 -171.000000C354.000000 -35.000000,285.000000 -6.000000,241.000000 -6.000000C198.000000 -6.000000,123.000000 -23.000000,88.000000 -82.000000C123.000000 -77.000000,154.000000 -99.000000,154.000000 -137.000000C154.000000 -173.000000,127.000000 -193.000000,98.000000 -193.000000C74.000000 -193.000000,42.000000 -179.000000,42.000000 -135.000000C42.000000 -44.000000,135.000000 22.000000,244.000000 22.000000C366.000000 22.000000,457.000000 -69.000000,457.000000 -171.000000C457.000000 -253.000000,394.000000 -331.000000,290.000000 -352.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmsy10_1">
      <path style="fill-rule: evenodd;" d="M192.000000 -250.000000C192.000000 -279.000000,168.000000 -303.000000,139.000000 -303.000000C110.000000 -303.000000,86.000000 -279.000000,86.000000 -250.000000C86.000000 -221.000000,110.000000 -197.000000,139.000000 -197.000000C168.000000 -197.000000,192.000000 -221.000000,192.000000 -250.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmmi10_39">
      <path style="fill-rule: evenodd;" d="M170.000000 170.000000C166.000000 183.000000,165.000000 185.000000,165.000000 190.000000C165.000000 212.000000,184.000000 218.000000,194.000000 218.000000C199.000000 218.000000,221.000000 215.000000,231.000000 192.000000C234.000000 184.000000,239.000000 151.000000,266.000000 9.000000C275.000000 10.000000,282.000000 11.000000,299.000000 11.000000C465.000000 11.000000,619.000000 -146.000000,619.000000 -304.000000C619.000000 -382.000000,580.000000 -442.000000,505.000000 -442.000000C360.000000 -442.000000,300.000000 -248.000000,240.000000 -53.000000C132.000000 -73.000000,76.000000 -129.000000,76.000000 -201.000000C76.000000 -229.000000,99.000000 -339.000000,159.000000 -408.000000C167.000000 -417.000000,167.000000 -419.000000,167.000000 -421.000000C167.000000 -425.000000,165.000000 -431.000000,155.000000 -431.000000C127.000000 -431.000000,50.000000 -286.000000,50.000000 -190.000000C50.000000 -96.000000,116.000000 -23.000000,223.000000 2.000000M308.000000 -47.000000C300.000000 -47.000000,298.000000 -47.000000,290.000000 -48.000000C278.000000 -48.000000,277.000000 -49.000000,277.000000 -52.000000C277.000000 -54.000000,294.000000 -145.000000,297.000000 -160.000000C328.000000 -288.000000,406.000000 -384.000000,495.000000 -384.000000C564.000000 -384.000000,591.000000 -330.000000,591.000000 -282.000000C591.000000 -169.000000,462.000000 -47.000000,308.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_82">
      <path style="fill-rule: evenodd;" d="M283.000000 -361.000000L283.000000 -639.000000L401.000000 -639.000000C562.000000 -639.000000,564.000000 -561.000000,564.000000 -500.000000C564.000000 -444.000000,564.000000 -361.000000,399.000000 -361.000000M550.000000 -340.000000C666.000000 -370.000000,717.000000 -435.000000,717.000000 -501.000000C717.000000 -602.000000,607.000000 -686.000000,419.000000 -686.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L215.000000 -0.000000L75.000000 -3.000000L173.000000 -3.000000L215.000000 -3.000000L257.000000 -3.000000L355.000000 -3.000000L391.000000 -0.000000L391.000000 -47.000000L283.000000 -47.000000L283.000000 -325.000000L400.000000 -325.000000C414.000000 -325.000000,458.000000 -325.000000,489.000000 -291.000000C521.000000 -256.000000,521.000000 -237.000000,521.000000 -164.000000C521.000000 -98.000000,521.000000 -49.000000,591.000000 -15.000000C635.000000 7.000000,697.000000 11.000000,738.000000 11.000000C845.000000 11.000000,858.000000 -79.000000,858.000000 -95.000000C858.000000 -117.000000,844.000000 -117.000000,834.000000 -117.000000C813.000000 -117.000000,812.000000 -107.000000,811.000000 -94.000000C806.000000 -47.000000,777.000000 -25.000000,747.000000 -25.000000C687.000000 -25.000000,678.000000 -96.000000,673.000000 -138.000000C671.000000 -149.000000,663.000000 -218.000000,662.000000 -223.000000C648.000000 -293.000000,593.000000 -324.000000,550.000000 -340.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.503555 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,14.251953 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_122"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,21.596771 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,27.795670 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,38.223373 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_49"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,55.934647 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,63.904770 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,77.653137 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_121"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,85.315262 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,91.514297 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,101.941879 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_50"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,119.653305 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,127.623398 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,141.371796 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_122"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,148.716614 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,154.915665 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,165.343216 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_51"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
</svg></span>), you can create the
corresponding homogeneous transformation matrix step by step using the
operators <a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate</span><span data-if="c" style="display:none">hom_mat3d_rotate</span><span data-if="cpp" style="display:none">HomMat3dRotate</span><span data-if="com" style="display:none">HomMat3dRotate</span><span data-if="dotnet" style="display:none">HomMat3dRotate</span><span data-if="python" style="display:none">hom_mat3d_rotate</span></code></a> and <a href="hom_mat3d_translate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_translate</span><span data-if="c" style="display:none">hom_mat3d_translate</span><span data-if="cpp" style="display:none">HomMat3dTranslate</span><span data-if="com" style="display:none">HomMat3dTranslate</span><span data-if="dotnet" style="display:none">HomMat3dTranslate</span><span data-if="python" style="display:none">hom_mat3d_translate</span></code></a> and then
convert the matrix into a pose using <a href="hom_mat3d_to_pose.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_to_pose</span><span data-if="c" style="display:none">hom_mat3d_to_pose</span><span data-if="cpp" style="display:none">HomMat3dToPose</span><span data-if="com" style="display:none">HomMat3dToPose</span><span data-if="dotnet" style="display:none">HomMat3dToPose</span><span data-if="python" style="display:none">hom_mat3d_to_pose</span></code></a>. The following
example code creates a pose from the ZYZ representation described above:
</p>
<div style="text-align:center"><table style="width:90%;margin-left:auto;margin-right:auto" class="layout">
<col span="1" style="width:90%;">
<tr><td style="text-align:left">
<a href="hom_mat3d_identity.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_identity(HomMat3DIdent)</span><span data-if="c" style="display:none">hom_mat3d_identity(HomMat3DIdent)</span><span data-if="cpp" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="com" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="dotnet" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="python" style="display:none">hom_mat3d_identity(HomMat3DIdent)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DIdent, phi3, 'z', 0, 0, 0, HomMat3DRotZ)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DRotZ, phi2, 'y', 0, 0, 0, HomMat3DRotZY)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DRotZY, phi1, 'z', 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_translate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="c" style="display:none">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="cpp" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="com" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="dotnet" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="python" style="display:none">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_to_pose.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_to_pose(base_H_tool, RobPose)</span><span data-if="c" style="display:none">hom_mat3d_to_pose(base_H_tool, RobPose)</span><span data-if="cpp" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="com" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="dotnet" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="python" style="display:none">hom_mat3d_to_pose(base_H_tool, RobPose)</span></code></a>
</td></tr>
</table></div>

<p>Please note that the hand-eye calibration only works if the robot poses
<a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a> are specified with high accuracy!
</p>
</dd>

<dt><b>What is the order of the individual parameters?</b></dt>
<dd>


<p>The length of the tuple <a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a> corresponds to the number of
different positions of the manipulator and thus to the number of calibration
images.  The parameter <a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a> determines the number of
calibration points used in the individual positions.  If the standard
calibration plate is used, this means 49 points per position (image).
If, for example, 15 images were acquired, <a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a> is a tuple
of length 15, where all elements of the tuple have the value 49.
</p>
<p>The number of images in the sequence, which is determined by the length of
<a href="#NumPoints"><i><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></i></a>, must also be taken into account for the tuples of
the 3D calibration points and the extracted 2D marks, respectively. Hence,
for 15 calibration images with 49 calibration points each, the tuples
<a href="#X"><i><code><span data-if="hdevelop" style="display:inline">X</span><span data-if="c" style="display:none">X</span><span data-if="cpp" style="display:none">X</span><span data-if="com" style="display:none">X</span><span data-if="dotnet" style="display:none">x</span><span data-if="python" style="display:none">x</span></code></i></a>, <a href="#Y"><i><code><span data-if="hdevelop" style="display:inline">Y</span><span data-if="c" style="display:none">Y</span><span data-if="cpp" style="display:none">Y</span><span data-if="com" style="display:none">Y</span><span data-if="dotnet" style="display:none">y</span><span data-if="python" style="display:none">y</span></code></i></a>, <a href="#Z"><i><code><span data-if="hdevelop" style="display:inline">Z</span><span data-if="c" style="display:none">Z</span><span data-if="cpp" style="display:none">Z</span><span data-if="com" style="display:none">Z</span><span data-if="dotnet" style="display:none">z</span><span data-if="python" style="display:none">z</span></code></i></a>, <a href="#Row"><i><code><span data-if="hdevelop" style="display:inline">Row</span><span data-if="c" style="display:none">Row</span><span data-if="cpp" style="display:none">Row</span><span data-if="com" style="display:none">Row</span><span data-if="dotnet" style="display:none">row</span><span data-if="python" style="display:none">row</span></code></i></a>, and <a href="#Col"><i><code><span data-if="hdevelop" style="display:inline">Col</span><span data-if="c" style="display:none">Col</span><span data-if="cpp" style="display:none">Col</span><span data-if="com" style="display:none">Col</span><span data-if="dotnet" style="display:none">col</span><span data-if="python" style="display:none">col</span></code></i></a> must
contain <span title="8" style="vertical-align:-0.0710211em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="5.66081em" height="0.767042em" viewBox="0 0 90.572968 12.272675">
<!-- Original BoundingBox: -45.286484 -6.136337 45.286484 6.136337 -->
  <defs>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_49">
      <path style="fill-rule: evenodd;" d="M294.000000 -640.000000C294.000000 -664.000000,294.000000 -666.000000,271.000000 -666.000000C209.000000 -602.000000,121.000000 -602.000000,89.000000 -602.000000L89.000000 -571.000000C109.000000 -571.000000,168.000000 -571.000000,220.000000 -597.000000L220.000000 -79.000000C220.000000 -43.000000,217.000000 -31.000000,127.000000 -31.000000L95.000000 -31.000000L95.000000 -0.000000L257.000000 -0.000000L130.000000 -3.000000L217.000000 -3.000000L257.000000 -3.000000L297.000000 -3.000000L384.000000 -3.000000L419.000000 -0.000000L419.000000 -31.000000L387.000000 -31.000000C297.000000 -31.000000,294.000000 -42.000000,294.000000 -79.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_51">
      <path style="fill-rule: evenodd;" d="M290.000000 -352.000000C372.000000 -379.000000,430.000000 -449.000000,430.000000 -528.000000C430.000000 -610.000000,342.000000 -666.000000,246.000000 -666.000000C145.000000 -666.000000,69.000000 -606.000000,69.000000 -530.000000C69.000000 -497.000000,91.000000 -478.000000,120.000000 -478.000000C151.000000 -478.000000,171.000000 -500.000000,171.000000 -529.000000C171.000000 -579.000000,124.000000 -579.000000,109.000000 -579.000000C140.000000 -628.000000,206.000000 -641.000000,242.000000 -641.000000C283.000000 -641.000000,338.000000 -619.000000,338.000000 -529.000000C338.000000 -517.000000,336.000000 -459.000000,310.000000 -415.000000C280.000000 -367.000000,246.000000 -364.000000,221.000000 -363.000000C213.000000 -362.000000,189.000000 -360.000000,182.000000 -360.000000C174.000000 -359.000000,167.000000 -358.000000,167.000000 -348.000000C167.000000 -337.000000,174.000000 -337.000000,191.000000 -337.000000L235.000000 -337.000000C317.000000 -337.000000,354.000000 -269.000000,354.000000 -171.000000C354.000000 -35.000000,285.000000 -6.000000,241.000000 -6.000000C198.000000 -6.000000,123.000000 -23.000000,88.000000 -82.000000C123.000000 -77.000000,154.000000 -99.000000,154.000000 -137.000000C154.000000 -173.000000,127.000000 -193.000000,98.000000 -193.000000C74.000000 -193.000000,42.000000 -179.000000,42.000000 -135.000000C42.000000 -44.000000,135.000000 22.000000,244.000000 22.000000C366.000000 22.000000,457.000000 -69.000000,457.000000 -171.000000C457.000000 -253.000000,394.000000 -331.000000,290.000000 -352.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_52">
      <path style="fill-rule: evenodd;" d="M294.000000 -165.000000L294.000000 -78.000000C294.000000 -42.000000,292.000000 -31.000000,218.000000 -31.000000L197.000000 -31.000000L197.000000 -0.000000L332.000000 -0.000000L238.000000 -3.000000L290.000000 -3.000000L332.000000 -3.000000L374.000000 -3.000000L427.000000 -3.000000L468.000000 -0.000000L468.000000 -31.000000L447.000000 -31.000000C373.000000 -31.000000,371.000000 -42.000000,371.000000 -78.000000L371.000000 -165.000000L471.000000 -165.000000L471.000000 -196.000000L371.000000 -196.000000L371.000000 -651.000000C371.000000 -671.000000,371.000000 -677.000000,355.000000 -677.000000C346.000000 -677.000000,343.000000 -677.000000,335.000000 -665.000000L28.000000 -196.000000L28.000000 -165.000000M300.000000 -196.000000L56.000000 -196.000000L300.000000 -569.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_53">
      <path style="fill-rule: evenodd;" d="M449.000000 -201.000000C449.000000 -320.000000,367.000000 -420.000000,259.000000 -420.000000C211.000000 -420.000000,168.000000 -404.000000,132.000000 -369.000000L132.000000 -564.000000C152.000000 -558.000000,185.000000 -551.000000,217.000000 -551.000000C340.000000 -551.000000,410.000000 -642.000000,410.000000 -655.000000C410.000000 -661.000000,407.000000 -666.000000,400.000000 -666.000000C399.000000 -666.000000,397.000000 -666.000000,392.000000 -663.000000C372.000000 -654.000000,323.000000 -634.000000,256.000000 -634.000000C216.000000 -634.000000,170.000000 -641.000000,123.000000 -662.000000C115.000000 -665.000000,113.000000 -665.000000,111.000000 -665.000000C101.000000 -665.000000,101.000000 -657.000000,101.000000 -641.000000L101.000000 -345.000000C101.000000 -327.000000,101.000000 -319.000000,115.000000 -319.000000C122.000000 -319.000000,124.000000 -322.000000,128.000000 -328.000000C139.000000 -344.000000,176.000000 -398.000000,257.000000 -398.000000C309.000000 -398.000000,334.000000 -352.000000,342.000000 -334.000000C358.000000 -297.000000,360.000000 -258.000000,360.000000 -208.000000C360.000000 -173.000000,360.000000 -113.000000,336.000000 -71.000000C312.000000 -32.000000,275.000000 -6.000000,229.000000 -6.000000C156.000000 -6.000000,99.000000 -59.000000,82.000000 -118.000000C85.000000 -117.000000,88.000000 -116.000000,99.000000 -116.000000C132.000000 -116.000000,149.000000 -141.000000,149.000000 -165.000000C149.000000 -189.000000,132.000000 -214.000000,99.000000 -214.000000C85.000000 -214.000000,50.000000 -207.000000,50.000000 -161.000000C50.000000 -75.000000,119.000000 22.000000,231.000000 22.000000C347.000000 22.000000,449.000000 -74.000000,449.000000 -201.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_55">
      <path style="fill-rule: evenodd;" d="M476.000000 -609.000000C485.000000 -621.000000,485.000000 -623.000000,485.000000 -644.000000L242.000000 -644.000000C120.000000 -644.000000,118.000000 -657.000000,114.000000 -676.000000L89.000000 -676.000000L56.000000 -470.000000L81.000000 -470.000000C84.000000 -486.000000,93.000000 -549.000000,106.000000 -561.000000C113.000000 -567.000000,191.000000 -567.000000,204.000000 -567.000000L411.000000 -567.000000C400.000000 -551.000000,321.000000 -442.000000,299.000000 -409.000000C209.000000 -274.000000,176.000000 -135.000000,176.000000 -33.000000C176.000000 -23.000000,176.000000 22.000000,222.000000 22.000000C268.000000 22.000000,268.000000 -23.000000,268.000000 -33.000000L268.000000 -84.000000C268.000000 -139.000000,271.000000 -194.000000,279.000000 -248.000000C283.000000 -271.000000,297.000000 -357.000000,341.000000 -419.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_57">
      <path style="fill-rule: evenodd;" d="M367.000000 -318.000000L367.000000 -286.000000C367.000000 -52.000000,263.000000 -6.000000,205.000000 -6.000000C188.000000 -6.000000,134.000000 -8.000000,107.000000 -42.000000C151.000000 -42.000000,159.000000 -71.000000,159.000000 -88.000000C159.000000 -119.000000,135.000000 -134.000000,113.000000 -134.000000C97.000000 -134.000000,67.000000 -125.000000,67.000000 -86.000000C67.000000 -19.000000,121.000000 22.000000,206.000000 22.000000C335.000000 22.000000,457.000000 -114.000000,457.000000 -329.000000C457.000000 -598.000000,342.000000 -666.000000,253.000000 -666.000000C198.000000 -666.000000,149.000000 -648.000000,106.000000 -603.000000C65.000000 -558.000000,42.000000 -516.000000,42.000000 -441.000000C42.000000 -316.000000,130.000000 -218.000000,242.000000 -218.000000C303.000000 -218.000000,344.000000 -260.000000,367.000000 -318.000000M243.000000 -241.000000C227.000000 -241.000000,181.000000 -241.000000,150.000000 -304.000000C132.000000 -341.000000,132.000000 -391.000000,132.000000 -440.000000C132.000000 -494.000000,132.000000 -541.000000,153.000000 -578.000000C180.000000 -628.000000,218.000000 -641.000000,253.000000 -641.000000C299.000000 -641.000000,332.000000 -607.000000,349.000000 -562.000000C361.000000 -530.000000,365.000000 -467.000000,365.000000 -421.000000C365.000000 -338.000000,331.000000 -241.000000,243.000000 -241.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_61">
      <path style="fill-rule: evenodd;" d="M687.000000 -327.000000C702.000000 -327.000000,721.000000 -327.000000,721.000000 -347.000000C721.000000 -367.000000,702.000000 -367.000000,688.000000 -367.000000L89.000000 -367.000000C75.000000 -367.000000,56.000000 -367.000000,56.000000 -347.000000C56.000000 -327.000000,75.000000 -327.000000,90.000000 -327.000000M688.000000 -133.000000C702.000000 -133.000000,721.000000 -133.000000,721.000000 -153.000000C721.000000 -173.000000,702.000000 -173.000000,687.000000 -173.000000L90.000000 -173.000000C75.000000 -173.000000,56.000000 -173.000000,56.000000 -153.000000C56.000000 -133.000000,75.000000 -133.000000,89.000000 -133.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmsy10_1">
      <path style="fill-rule: evenodd;" d="M192.000000 -250.000000C192.000000 -279.000000,168.000000 -303.000000,139.000000 -303.000000C110.000000 -303.000000,86.000000 -279.000000,86.000000 -250.000000C86.000000 -221.000000,110.000000 -197.000000,139.000000 -197.000000C168.000000 -197.000000,192.000000 -221.000000,192.000000 -250.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.729507 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_49"></use>
    <use xlink:href="#GLYPHcmr10_53" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,20.211975 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,28.182098 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_52"></use>
    <use xlink:href="#GLYPHcmr10_57" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,48.550171 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_61"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,65.375854 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_55"></use>
    <use xlink:href="#GLYPHcmr10_51" x="5.000095"></use>
    <use xlink:href="#GLYPHcmr10_53" x="10.000190"></use>
  </g>
</svg></span> values each.  These tuples
are ordered according to the image the respective points lie in, i.e.,
the first 49 values correspond to the 49 calibration points in the first
image.  The order of the 3D calibration points and the extracted 2D
calibration points must be the same in each image.
</p>
<p>The length of the tuple <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a> also depends on the number of
calibration images.  If, for example, 15 images and therefore 15 poses
are used, the length of the tuple <a href="#RobotPoses"><i><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></i></a> is
<span title="9" style="vertical-align:-0.0710211em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="5.16267em" height="0.767042em" viewBox="0 0 82.602707 12.272675">
<!-- Original BoundingBox: -41.301361 -6.136337 41.301346 6.136337 -->
  <defs>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_48">
      <path style="fill-rule: evenodd;" d="M460.000000 -320.000000C460.000000 -400.000000,455.000000 -480.000000,420.000000 -554.000000C374.000000 -650.000000,292.000000 -666.000000,250.000000 -666.000000C190.000000 -666.000000,117.000000 -640.000000,76.000000 -547.000000C44.000000 -478.000000,39.000000 -400.000000,39.000000 -320.000000C39.000000 -245.000000,43.000000 -155.000000,84.000000 -79.000000C127.000000 2.000000,200.000000 22.000000,249.000000 22.000000C303.000000 22.000000,379.000000 1.000000,423.000000 -94.000000C455.000000 -163.000000,460.000000 -241.000000,460.000000 -320.000000M249.000000 -0.000000C210.000000 -0.000000,151.000000 -25.000000,133.000000 -121.000000C122.000000 -181.000000,122.000000 -273.000000,122.000000 -332.000000C122.000000 -396.000000,122.000000 -462.000000,130.000000 -516.000000C149.000000 -635.000000,224.000000 -644.000000,249.000000 -644.000000C282.000000 -644.000000,348.000000 -626.000000,367.000000 -527.000000C377.000000 -471.000000,377.000000 -395.000000,377.000000 -332.000000C377.000000 -257.000000,377.000000 -189.000000,366.000000 -125.000000C351.000000 -30.000000,294.000000 -0.000000,249.000000 -0.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_49">
      <path style="fill-rule: evenodd;" d="M294.000000 -640.000000C294.000000 -664.000000,294.000000 -666.000000,271.000000 -666.000000C209.000000 -602.000000,121.000000 -602.000000,89.000000 -602.000000L89.000000 -571.000000C109.000000 -571.000000,168.000000 -571.000000,220.000000 -597.000000L220.000000 -79.000000C220.000000 -43.000000,217.000000 -31.000000,127.000000 -31.000000L95.000000 -31.000000L95.000000 -0.000000L257.000000 -0.000000L130.000000 -3.000000L217.000000 -3.000000L257.000000 -3.000000L297.000000 -3.000000L384.000000 -3.000000L419.000000 -0.000000L419.000000 -31.000000L387.000000 -31.000000C297.000000 -31.000000,294.000000 -42.000000,294.000000 -79.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_53">
      <path style="fill-rule: evenodd;" d="M449.000000 -201.000000C449.000000 -320.000000,367.000000 -420.000000,259.000000 -420.000000C211.000000 -420.000000,168.000000 -404.000000,132.000000 -369.000000L132.000000 -564.000000C152.000000 -558.000000,185.000000 -551.000000,217.000000 -551.000000C340.000000 -551.000000,410.000000 -642.000000,410.000000 -655.000000C410.000000 -661.000000,407.000000 -666.000000,400.000000 -666.000000C399.000000 -666.000000,397.000000 -666.000000,392.000000 -663.000000C372.000000 -654.000000,323.000000 -634.000000,256.000000 -634.000000C216.000000 -634.000000,170.000000 -641.000000,123.000000 -662.000000C115.000000 -665.000000,113.000000 -665.000000,111.000000 -665.000000C101.000000 -665.000000,101.000000 -657.000000,101.000000 -641.000000L101.000000 -345.000000C101.000000 -327.000000,101.000000 -319.000000,115.000000 -319.000000C122.000000 -319.000000,124.000000 -322.000000,128.000000 -328.000000C139.000000 -344.000000,176.000000 -398.000000,257.000000 -398.000000C309.000000 -398.000000,334.000000 -352.000000,342.000000 -334.000000C358.000000 -297.000000,360.000000 -258.000000,360.000000 -208.000000C360.000000 -173.000000,360.000000 -113.000000,336.000000 -71.000000C312.000000 -32.000000,275.000000 -6.000000,229.000000 -6.000000C156.000000 -6.000000,99.000000 -59.000000,82.000000 -118.000000C85.000000 -117.000000,88.000000 -116.000000,99.000000 -116.000000C132.000000 -116.000000,149.000000 -141.000000,149.000000 -165.000000C149.000000 -189.000000,132.000000 -214.000000,99.000000 -214.000000C85.000000 -214.000000,50.000000 -207.000000,50.000000 -161.000000C50.000000 -75.000000,119.000000 22.000000,231.000000 22.000000C347.000000 22.000000,449.000000 -74.000000,449.000000 -201.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_55">
      <path style="fill-rule: evenodd;" d="M476.000000 -609.000000C485.000000 -621.000000,485.000000 -623.000000,485.000000 -644.000000L242.000000 -644.000000C120.000000 -644.000000,118.000000 -657.000000,114.000000 -676.000000L89.000000 -676.000000L56.000000 -470.000000L81.000000 -470.000000C84.000000 -486.000000,93.000000 -549.000000,106.000000 -561.000000C113.000000 -567.000000,191.000000 -567.000000,204.000000 -567.000000L411.000000 -567.000000C400.000000 -551.000000,321.000000 -442.000000,299.000000 -409.000000C209.000000 -274.000000,176.000000 -135.000000,176.000000 -33.000000C176.000000 -23.000000,176.000000 22.000000,222.000000 22.000000C268.000000 22.000000,268.000000 -23.000000,268.000000 -33.000000L268.000000 -84.000000C268.000000 -139.000000,271.000000 -194.000000,279.000000 -248.000000C283.000000 -271.000000,297.000000 -357.000000,341.000000 -419.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_61">
      <path style="fill-rule: evenodd;" d="M687.000000 -327.000000C702.000000 -327.000000,721.000000 -327.000000,721.000000 -347.000000C721.000000 -367.000000,702.000000 -367.000000,688.000000 -367.000000L89.000000 -367.000000C75.000000 -367.000000,56.000000 -367.000000,56.000000 -347.000000C56.000000 -327.000000,75.000000 -327.000000,90.000000 -327.000000M688.000000 -133.000000C702.000000 -133.000000,721.000000 -133.000000,721.000000 -153.000000C721.000000 -173.000000,702.000000 -173.000000,687.000000 -173.000000L90.000000 -173.000000C75.000000 -173.000000,56.000000 -173.000000,56.000000 -153.000000C56.000000 -133.000000,75.000000 -133.000000,89.000000 -133.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmsy10_1">
      <path style="fill-rule: evenodd;" d="M192.000000 -250.000000C192.000000 -279.000000,168.000000 -303.000000,139.000000 -303.000000C110.000000 -303.000000,86.000000 -279.000000,86.000000 -250.000000C86.000000 -221.000000,110.000000 -197.000000,139.000000 -197.000000C168.000000 -197.000000,192.000000 -221.000000,192.000000 -250.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.714630 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_49"></use>
    <use xlink:href="#GLYPHcmr10_53" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,20.197098 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,28.167221 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_55"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.565033 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_61"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,57.390854 11.136337)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_49"></use>
    <use xlink:href="#GLYPHcmr10_48" x="5.000095"></use>
    <use xlink:href="#GLYPHcmr10_53" x="10.000190"></use>
  </g>
</svg></span> (15 times 7 pose parameters).
The first seven parameters thus determine the pose of the manipulator
in the first image, and so on.
</p>
</dd>

<dt><b>Algorithm and output parameters</b></dt>
<dd>


<p>The parameter <a href="#Method"><i><code><span data-if="hdevelop" style="display:inline">Method</span><span data-if="c" style="display:none">Method</span><span data-if="cpp" style="display:none">Method</span><span data-if="com" style="display:none">Method</span><span data-if="dotnet" style="display:none">method</span><span data-if="python" style="display:none">method</span></code></i></a> determines the type of algorithm used for the
hand-eye calibration: With <i><span data-if="hdevelop" style="display:inline">'linear'</span><span data-if="c" style="display:none">"linear"</span><span data-if="cpp" style="display:none">"linear"</span><span data-if="com" style="display:none">"linear"</span><span data-if="dotnet" style="display:none">"linear"</span><span data-if="python" style="display:none">"linear"</span></i> a linear algorithm is chosen,
which is fast but in many practical situations not accurate enough.
<i><span data-if="hdevelop" style="display:inline">'nonlinear'</span><span data-if="c" style="display:none">"nonlinear"</span><span data-if="cpp" style="display:none">"nonlinear"</span><span data-if="com" style="display:none">"nonlinear"</span><span data-if="dotnet" style="display:none">"nonlinear"</span><span data-if="python" style="display:none">"nonlinear"</span></i> selects a non-linear algorithm, which results in
the most accurately calibrated poses and which is the method of choice.
</p>
<p>For the calibration of SCARA robots the parameter <a href="#Method"><i><code><span data-if="hdevelop" style="display:inline">Method</span><span data-if="c" style="display:none">Method</span><span data-if="cpp" style="display:none">Method</span><span data-if="com" style="display:none">Method</span><span data-if="dotnet" style="display:none">method</span><span data-if="python" style="display:none">method</span></code></i></a> must
be set to <i><span data-if="hdevelop" style="display:inline">'scara_linear'</span><span data-if="c" style="display:none">"scara_linear"</span><span data-if="cpp" style="display:none">"scara_linear"</span><span data-if="com" style="display:none">"scara_linear"</span><span data-if="dotnet" style="display:none">"scara_linear"</span><span data-if="python" style="display:none">"scara_linear"</span></i> or <i><span data-if="hdevelop" style="display:inline">'scara_nonlinear'</span><span data-if="c" style="display:none">"scara_nonlinear"</span><span data-if="cpp" style="display:none">"scara_nonlinear"</span><span data-if="com" style="display:none">"scara_nonlinear"</span><span data-if="dotnet" style="display:none">"scara_nonlinear"</span><span data-if="python" style="display:none">"scara_nonlinear"</span></i>,
respectively. While the arm of an articulated robot has three rotary
joints typically covering 6 degrees of freedom (3 translations and 3
rotations), SCARA robots have two parallel rotary joints and one parallel
prismatic joint covering only 4 degrees of freedom (3 translations and 1
rotation). Loosely speaking, an articulated robot is able to tilt its
end effector while a SCARA robot is not.
</p>
<p>The parameter <a href="#QualityType"><i><code><span data-if="hdevelop" style="display:inline">QualityType</span><span data-if="c" style="display:none">QualityType</span><span data-if="cpp" style="display:none">QualityType</span><span data-if="com" style="display:none">QualityType</span><span data-if="dotnet" style="display:none">qualityType</span><span data-if="python" style="display:none">quality_type</span></code></i></a> switches between different possibilities
for assessing the quality of the calibration result returned in
<a href="#Quality"><i><code><span data-if="hdevelop" style="display:inline">Quality</span><span data-if="c" style="display:none">Quality</span><span data-if="cpp" style="display:none">Quality</span><span data-if="com" style="display:none">Quality</span><span data-if="dotnet" style="display:none">quality</span><span data-if="python" style="display:none">quality</span></code></i></a>. <i><span data-if="hdevelop" style="display:inline">'error_pose'</span><span data-if="c" style="display:none">"error_pose"</span><span data-if="cpp" style="display:none">"error_pose"</span><span data-if="com" style="display:none">"error_pose"</span><span data-if="dotnet" style="display:none">"error_pose"</span><span data-if="python" style="display:none">"error_pose"</span></i> stands for the pose error of the
complete chain of transformations. To be more precise, a tuple with four
elements is returned, where the first element is the root-mean-square error
of the translational part, the second element is the root-mean-square error
of the rotational part, the third element is the maximum translational
error and the fourth element is the maximum rotational error.
With <i><span data-if="hdevelop" style="display:inline">'standard_deviation'</span><span data-if="c" style="display:none">"standard_deviation"</span><span data-if="cpp" style="display:none">"standard_deviation"</span><span data-if="com" style="display:none">"standard_deviation"</span><span data-if="dotnet" style="display:none">"standard_deviation"</span><span data-if="python" style="display:none">"standard_deviation"</span></i>, a tuple with 12 elements containing the
standard deviations of the two poses is returned: The first six elements
refer to the camera pose and the others to the pose of the calibration
points. With <i><span data-if="hdevelop" style="display:inline">'covariance'</span><span data-if="c" style="display:none">"covariance"</span><span data-if="cpp" style="display:none">"covariance"</span><span data-if="com" style="display:none">"covariance"</span><span data-if="dotnet" style="display:none">"covariance"</span><span data-if="python" style="display:none">"covariance"</span></i>, the full 12x12 covariance matrix of
both poses is returned. Like poses, the standard deviations and the
covariances are specified in the units [m] and [°].
Note that selecting <i><span data-if="hdevelop" style="display:inline">'linear'</span><span data-if="c" style="display:none">"linear"</span><span data-if="cpp" style="display:none">"linear"</span><span data-if="com" style="display:none">"linear"</span><span data-if="dotnet" style="display:none">"linear"</span><span data-if="python" style="display:none">"linear"</span></i> or <i><span data-if="hdevelop" style="display:inline">'scara_linear'</span><span data-if="c" style="display:none">"scara_linear"</span><span data-if="cpp" style="display:none">"scara_linear"</span><span data-if="com" style="display:none">"scara_linear"</span><span data-if="dotnet" style="display:none">"scara_linear"</span><span data-if="python" style="display:none">"scara_linear"</span></i> for
the parameter <a href="#Method"><i><code><span data-if="hdevelop" style="display:inline">Method</span><span data-if="c" style="display:none">Method</span><span data-if="cpp" style="display:none">Method</span><span data-if="com" style="display:none">Method</span><span data-if="dotnet" style="display:none">method</span><span data-if="python" style="display:none">method</span></code></i></a> enables only the output of the pose error
(<i><span data-if="hdevelop" style="display:inline">'error_pose'</span><span data-if="c" style="display:none">"error_pose"</span><span data-if="cpp" style="display:none">"error_pose"</span><span data-if="com" style="display:none">"error_pose"</span><span data-if="dotnet" style="display:none">"error_pose"</span><span data-if="python" style="display:none">"error_pose"</span></i>).
</p>
</dd>
</dl>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  <li>未经并行化处理。</li>
</ul>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="X" class="parname"><b><code><span data-if="hdevelop" style="display:inline">X</span><span data-if="c" style="display:none">X</span><span data-if="cpp" style="display:none">X</span><span data-if="com" style="display:none">X</span><span data-if="dotnet" style="display:none">x</span><span data-if="python" style="display:none">x</span></code></b> (input_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Linear list containing all the x coordinates of the
calibration points (in the order of the images).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Y" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Y</span><span data-if="c" style="display:none">Y</span><span data-if="cpp" style="display:none">Y</span><span data-if="com" style="display:none">Y</span><span data-if="dotnet" style="display:none">y</span><span data-if="python" style="display:none">y</span></code></b> (input_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Linear list containing all the y coordinates of the
calibration points (in the order of the images).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Z" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Z</span><span data-if="c" style="display:none">Z</span><span data-if="cpp" style="display:none">Z</span><span data-if="com" style="display:none">Z</span><span data-if="dotnet" style="display:none">z</span><span data-if="python" style="display:none">z</span></code></b> (input_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Linear list containing all the z coordinates of the
calibration points (in the order of the images).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Row" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Row</span><span data-if="c" style="display:none">Row</span><span data-if="cpp" style="display:none">Row</span><span data-if="com" style="display:none">Row</span><span data-if="dotnet" style="display:none">row</span><span data-if="python" style="display:none">row</span></code></b> (input_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Linear list containing all row coordinates of the
calibration points (in the order of the images).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Col" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Col</span><span data-if="c" style="display:none">Col</span><span data-if="cpp" style="display:none">Col</span><span data-if="com" style="display:none">Col</span><span data-if="dotnet" style="display:none">col</span><span data-if="python" style="display:none">col</span></code></b> (input_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Linear list containing all the column coordinates of
the calibration points (in the order of the images).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="NumPoints" class="parname"><b><code><span data-if="hdevelop" style="display:inline">NumPoints</span><span data-if="c" style="display:none">NumPoints</span><span data-if="cpp" style="display:none">NumPoints</span><span data-if="com" style="display:none">NumPoints</span><span data-if="dotnet" style="display:none">numPoints</span><span data-if="python" style="display:none">num_points</span></code></b> (input_control)  </span><span>integer-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[int]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (integer)</span><span data-if="dotnet" style="display:none"> (<i>int</i> / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>Hlong</i>)</span><span data-if="c" style="display:none"> (<i>Hlong</i>)</span></span>
</div>
<p class="pardesc">Number of the calibration points for each image.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="RobotPoses" class="parname"><b><code><span data-if="hdevelop" style="display:inline">RobotPoses</span><span data-if="c" style="display:none">RobotPoses</span><span data-if="cpp" style="display:none">RobotPoses</span><span data-if="com" style="display:none">RobotPoses</span><span data-if="dotnet" style="display:none">robotPoses</span><span data-if="python" style="display:none">robot_poses</span></code></b> (input_control)  </span><span>pose-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HPose.html">HPose</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Known 3D pose of the robot for each image (moving
camera: robot base in robot tool coordinates;
stationary camera: robot tool in robot base
coordinates).</p>
</div>
  <div class="par">
<div class="parhead">
<span id="CameraParam" class="parname"><b><code><span data-if="hdevelop" style="display:inline">CameraParam</span><span data-if="c" style="display:none">CameraParam</span><span data-if="cpp" style="display:none">CameraParam</span><span data-if="com" style="display:none">CameraParam</span><span data-if="dotnet" style="display:none">cameraParam</span><span data-if="python" style="display:none">camera_param</span></code></b> (input_control)  </span><span>campar <code>→</code> <span data-if="dotnet" style="display:none"><a href="HCamPar.html">HCamPar</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float, str]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer / </span><span data-if="hdevelop" style="display:inline">string)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long / </span><span data-if="dotnet" style="display:none">string)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong / </span><span data-if="cpp" style="display:none">HString)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong / </span><span data-if="c" style="display:none">char*)</span></span>
</div>
<p class="pardesc">Internal camera parameters.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Method" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Method</span><span data-if="c" style="display:none">Method</span><span data-if="cpp" style="display:none">Method</span><span data-if="com" style="display:none">Method</span><span data-if="dotnet" style="display:none">method</span><span data-if="python" style="display:none">method</span></code></b> (input_control)  </span><span>string <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">str</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Method of hand-eye calibration.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'nonlinear'</span>
    <span data-if="c" style="display:none">"nonlinear"</span>
    <span data-if="cpp" style="display:none">"nonlinear"</span>
    <span data-if="com" style="display:none">"nonlinear"</span>
    <span data-if="dotnet" style="display:none">"nonlinear"</span>
    <span data-if="python" style="display:none">"nonlinear"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'linear'</span><span data-if="c" style="display:none">"linear"</span><span data-if="cpp" style="display:none">"linear"</span><span data-if="com" style="display:none">"linear"</span><span data-if="dotnet" style="display:none">"linear"</span><span data-if="python" style="display:none">"linear"</span>, <span data-if="hdevelop" style="display:inline">'nonlinear'</span><span data-if="c" style="display:none">"nonlinear"</span><span data-if="cpp" style="display:none">"nonlinear"</span><span data-if="com" style="display:none">"nonlinear"</span><span data-if="dotnet" style="display:none">"nonlinear"</span><span data-if="python" style="display:none">"nonlinear"</span>, <span data-if="hdevelop" style="display:inline">'scara_linear'</span><span data-if="c" style="display:none">"scara_linear"</span><span data-if="cpp" style="display:none">"scara_linear"</span><span data-if="com" style="display:none">"scara_linear"</span><span data-if="dotnet" style="display:none">"scara_linear"</span><span data-if="python" style="display:none">"scara_linear"</span>, <span data-if="hdevelop" style="display:inline">'scara_nonlinear'</span><span data-if="c" style="display:none">"scara_nonlinear"</span><span data-if="cpp" style="display:none">"scara_nonlinear"</span><span data-if="com" style="display:none">"scara_nonlinear"</span><span data-if="dotnet" style="display:none">"scara_nonlinear"</span><span data-if="python" style="display:none">"scara_nonlinear"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="QualityType" class="parname"><b><code><span data-if="hdevelop" style="display:inline">QualityType</span><span data-if="c" style="display:none">QualityType</span><span data-if="cpp" style="display:none">QualityType</span><span data-if="com" style="display:none">QualityType</span><span data-if="dotnet" style="display:none">qualityType</span><span data-if="python" style="display:none">quality_type</span></code></b> (input_control)  </span><span>string(-array) <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">MaybeSequence[str]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Type of quality assessment.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'error_pose'</span>
    <span data-if="c" style="display:none">"error_pose"</span>
    <span data-if="cpp" style="display:none">"error_pose"</span>
    <span data-if="com" style="display:none">"error_pose"</span>
    <span data-if="dotnet" style="display:none">"error_pose"</span>
    <span data-if="python" style="display:none">"error_pose"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'covariance'</span><span data-if="c" style="display:none">"covariance"</span><span data-if="cpp" style="display:none">"covariance"</span><span data-if="com" style="display:none">"covariance"</span><span data-if="dotnet" style="display:none">"covariance"</span><span data-if="python" style="display:none">"covariance"</span>, <span data-if="hdevelop" style="display:inline">'error_pose'</span><span data-if="c" style="display:none">"error_pose"</span><span data-if="cpp" style="display:none">"error_pose"</span><span data-if="com" style="display:none">"error_pose"</span><span data-if="dotnet" style="display:none">"error_pose"</span><span data-if="python" style="display:none">"error_pose"</span>, <span data-if="hdevelop" style="display:inline">'standard_deviation'</span><span data-if="c" style="display:none">"standard_deviation"</span><span data-if="cpp" style="display:none">"standard_deviation"</span><span data-if="com" style="display:none">"standard_deviation"</span><span data-if="dotnet" style="display:none">"standard_deviation"</span><span data-if="python" style="display:none">"standard_deviation"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="CameraPose" class="parname"><b><code><span data-if="hdevelop" style="display:inline">CameraPose</span><span data-if="c" style="display:none">CameraPose</span><span data-if="cpp" style="display:none">CameraPose</span><span data-if="com" style="display:none">CameraPose</span><span data-if="dotnet" style="display:none">cameraPose</span><span data-if="python" style="display:none">camera_pose</span></code></b> (output_control)  </span><span>pose <code>→</code> <span data-if="dotnet" style="display:none"><a href="HPose.html">HPose</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Computed relative camera pose: 3D pose of the robot tool
(moving camera) or robot base (stationary camera),
respectively, in camera coordinates.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="CalibrationPose" class="parname"><b><code><span data-if="hdevelop" style="display:inline">CalibrationPose</span><span data-if="c" style="display:none">CalibrationPose</span><span data-if="cpp" style="display:none">CalibrationPose</span><span data-if="com" style="display:none">CalibrationPose</span><span data-if="dotnet" style="display:none">calibrationPose</span><span data-if="python" style="display:none">calibration_pose</span></code></b> (output_control)  </span><span>pose <code>→</code> <span data-if="dotnet" style="display:none"><a href="HPose.html">HPose</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">Computed 3D pose of the calibration points in robot base
coordinates (moving camera) or in robot tool coordinates
(stationary camera), respectively.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Quality" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Quality</span><span data-if="c" style="display:none">Quality</span><span data-if="cpp" style="display:none">Quality</span><span data-if="com" style="display:none">Quality</span><span data-if="dotnet" style="display:none">quality</span><span data-if="python" style="display:none">quality</span></code></b> (output_control)  </span><span>real(-array) <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[float]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real)</span><span data-if="dotnet" style="display:none"> (<i>double</i>)</span><span data-if="cpp" style="display:none"> (<i>double</i>)</span><span data-if="c" style="display:none"> (<i>double</i>)</span></span>
</div>
<p class="pardesc">Quality assessment of the result.</p>
</div>
<h2 id="sec_example_all">例程 (HDevelop)</h2>
<pre class="example">
* Note that, in order to use this code snippet, you must provide
* the camera parameters, the calibration plate description file,
* the calibration images, and the robot poses.
read_cam_par('campar.dat', CameraParam)
CalDescr := 'caltab.descr'
caltab_points(CalDescr, X, Y, Z)
* Process all calibration images.
for i := 0 to NumImages-1 by 1
  read_image(Image, 'calib_'+i$'02d')
  * Find marks on the calibration plate in every image.
  find_caltab(Image, CalPlate, CalDescr, 3, 150, 5)
  find_marks_and_pose(Image, CalPlate, CalDescr, CameraParam, 128, 10, 18, \
                      0.9, 15, 100, RCoordTmp, CCoordTmp, StartPose)
  * Accumulate 2D and 3D coordinates of the marks.
  RCoord := [RCoord, RCoordTmp]
  CCoord := [CCoord, CCoordTmp]
  XCoord := [XCoord, X]
  YCoord := [YCoord, Y]
  ZCoord := [ZCoord, Z]
  NumMarker := [NumMarker, |RCoordTmp|]
  * Read pose of the robot tool in robot base coordinates.
  read_pose('robpose_'+i$'02d'+'.dat', RobPose)
  * Moving camera? Invert pose.
  if (IsMovingCameraConfig == 'true')
    pose_to_hom_mat3d(RobPose, base_H_tool)
    hom_mat3d_invert(base_H_tool, tool_H_base)
    hom_mat3d_to_pose(tool_H_base, RobPose)
  endif
  * Accumulate robot poses.
  RobotPoses := [RobotPoses, RobPose]
endfor
*
* Perform hand-eye calibration.
*
hand_eye_calibration(XCoord, YCoord, ZCoord, RCoord, CCoord, NumMarker, \
                     RobotPoses, CameraParam, 'nonlinear', 'error_pose', \
                     CameraPose, CalibrationPose, Error)
</pre>
<h2 id="sec_result">结果</h2>
<p>该算子 <code><span data-if="hdevelop" style="display:inline">hand_eye_calibration</span><span data-if="c" style="display:none">hand_eye_calibration</span><span data-if="cpp" style="display:none">HandEyeCalibration</span><span data-if="com" style="display:none">HandEyeCalibration</span><span data-if="dotnet" style="display:none">HandEyeCalibration</span><span data-if="python" style="display:none">hand_eye_calibration</span></code> 返回值 <TT>2</TT> (
      <TT>H_MSG_TRUE</TT>)
    
if the given parameters are correct. Otherwise, an exception will be raised.</p>
<h2 id="sec_predecessors">可能的前置算子</h2>
<p>
<code><a href="find_marks_and_pose.html"><span data-if="hdevelop" style="display:inline">find_marks_and_pose</span><span data-if="c" style="display:none">find_marks_and_pose</span><span data-if="cpp" style="display:none">FindMarksAndPose</span><span data-if="com" style="display:none">FindMarksAndPose</span><span data-if="dotnet" style="display:none">FindMarksAndPose</span><span data-if="python" style="display:none">find_marks_and_pose</span></a></code>, 
<code><a href="camera_calibration.html"><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></a></code>, 
<code><a href="calibrate_cameras.html"><span data-if="hdevelop" style="display:inline">calibrate_cameras</span><span data-if="c" style="display:none">calibrate_cameras</span><span data-if="cpp" style="display:none">CalibrateCameras</span><span data-if="com" style="display:none">CalibrateCameras</span><span data-if="dotnet" style="display:none">CalibrateCameras</span><span data-if="python" style="display:none">calibrate_cameras</span></a></code>
</p>
<h2 id="sec_successors">可能的后置算子</h2>
<p>
<code><a href="write_pose.html"><span data-if="hdevelop" style="display:inline">write_pose</span><span data-if="c" style="display:none">write_pose</span><span data-if="cpp" style="display:none">WritePose</span><span data-if="com" style="display:none">WritePose</span><span data-if="dotnet" style="display:none">WritePose</span><span data-if="python" style="display:none">write_pose</span></a></code>, 
<code><a href="convert_pose_type.html"><span data-if="hdevelop" style="display:inline">convert_pose_type</span><span data-if="c" style="display:none">convert_pose_type</span><span data-if="cpp" style="display:none">ConvertPoseType</span><span data-if="com" style="display:none">ConvertPoseType</span><span data-if="dotnet" style="display:none">ConvertPoseType</span><span data-if="python" style="display:none">convert_pose_type</span></a></code>, 
<code><a href="pose_to_hom_mat3d.html"><span data-if="hdevelop" style="display:inline">pose_to_hom_mat3d</span><span data-if="c" style="display:none">pose_to_hom_mat3d</span><span data-if="cpp" style="display:none">PoseToHomMat3d</span><span data-if="com" style="display:none">PoseToHomMat3d</span><span data-if="dotnet" style="display:none">PoseToHomMat3d</span><span data-if="python" style="display:none">pose_to_hom_mat3d</span></a></code>, 
<code><a href="disp_caltab.html"><span data-if="hdevelop" style="display:inline">disp_caltab</span><span data-if="c" style="display:none">disp_caltab</span><span data-if="cpp" style="display:none">DispCaltab</span><span data-if="com" style="display:none">DispCaltab</span><span data-if="dotnet" style="display:none">DispCaltab</span><span data-if="python" style="display:none">disp_caltab</span></a></code>, 
<code><a href="sim_caltab.html"><span data-if="hdevelop" style="display:inline">sim_caltab</span><span data-if="c" style="display:none">sim_caltab</span><span data-if="cpp" style="display:none">SimCaltab</span><span data-if="com" style="display:none">SimCaltab</span><span data-if="dotnet" style="display:none">SimCaltab</span><span data-if="python" style="display:none">sim_caltab</span></a></code>
</p>
<h2 id="sec_alternatives">可替代算子</h2>
<p>
<code><a href="calibrate_hand_eye.html"><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></a></code>
</p>
<h2 id="sec_see">参考其它</h2>
<p>
<code><a href="find_caltab.html"><span data-if="hdevelop" style="display:inline">find_caltab</span><span data-if="c" style="display:none">find_caltab</span><span data-if="cpp" style="display:none">FindCaltab</span><span data-if="com" style="display:none">FindCaltab</span><span data-if="dotnet" style="display:none">FindCaltab</span><span data-if="python" style="display:none">find_caltab</span></a></code>, 
<code><a href="find_marks_and_pose.html"><span data-if="hdevelop" style="display:inline">find_marks_and_pose</span><span data-if="c" style="display:none">find_marks_and_pose</span><span data-if="cpp" style="display:none">FindMarksAndPose</span><span data-if="com" style="display:none">FindMarksAndPose</span><span data-if="dotnet" style="display:none">FindMarksAndPose</span><span data-if="python" style="display:none">find_marks_and_pose</span></a></code>, 
<code><a href="disp_caltab.html"><span data-if="hdevelop" style="display:inline">disp_caltab</span><span data-if="c" style="display:none">disp_caltab</span><span data-if="cpp" style="display:none">DispCaltab</span><span data-if="com" style="display:none">DispCaltab</span><span data-if="dotnet" style="display:none">DispCaltab</span><span data-if="python" style="display:none">disp_caltab</span></a></code>, 
<code><a href="sim_caltab.html"><span data-if="hdevelop" style="display:inline">sim_caltab</span><span data-if="c" style="display:none">sim_caltab</span><span data-if="cpp" style="display:none">SimCaltab</span><span data-if="com" style="display:none">SimCaltab</span><span data-if="dotnet" style="display:none">SimCaltab</span><span data-if="python" style="display:none">sim_caltab</span></a></code>, 
<code><a href="write_cam_par.html"><span data-if="hdevelop" style="display:inline">write_cam_par</span><span data-if="c" style="display:none">write_cam_par</span><span data-if="cpp" style="display:none">WriteCamPar</span><span data-if="com" style="display:none">WriteCamPar</span><span data-if="dotnet" style="display:none">WriteCamPar</span><span data-if="python" style="display:none">write_cam_par</span></a></code>, 
<code><a href="read_cam_par.html"><span data-if="hdevelop" style="display:inline">read_cam_par</span><span data-if="c" style="display:none">read_cam_par</span><span data-if="cpp" style="display:none">ReadCamPar</span><span data-if="com" style="display:none">ReadCamPar</span><span data-if="dotnet" style="display:none">ReadCamPar</span><span data-if="python" style="display:none">read_cam_par</span></a></code>, 
<code><a href="create_pose.html"><span data-if="hdevelop" style="display:inline">create_pose</span><span data-if="c" style="display:none">create_pose</span><span data-if="cpp" style="display:none">CreatePose</span><span data-if="com" style="display:none">CreatePose</span><span data-if="dotnet" style="display:none">CreatePose</span><span data-if="python" style="display:none">create_pose</span></a></code>, 
<code><a href="convert_pose_type.html"><span data-if="hdevelop" style="display:inline">convert_pose_type</span><span data-if="c" style="display:none">convert_pose_type</span><span data-if="cpp" style="display:none">ConvertPoseType</span><span data-if="com" style="display:none">ConvertPoseType</span><span data-if="dotnet" style="display:none">ConvertPoseType</span><span data-if="python" style="display:none">convert_pose_type</span></a></code>, 
<code><a href="write_pose.html"><span data-if="hdevelop" style="display:inline">write_pose</span><span data-if="c" style="display:none">write_pose</span><span data-if="cpp" style="display:none">WritePose</span><span data-if="com" style="display:none">WritePose</span><span data-if="dotnet" style="display:none">WritePose</span><span data-if="python" style="display:none">write_pose</span></a></code>, 
<code><a href="read_pose.html"><span data-if="hdevelop" style="display:inline">read_pose</span><span data-if="c" style="display:none">read_pose</span><span data-if="cpp" style="display:none">ReadPose</span><span data-if="com" style="display:none">ReadPose</span><span data-if="dotnet" style="display:none">ReadPose</span><span data-if="python" style="display:none">read_pose</span></a></code>, 
<code><a href="pose_to_hom_mat3d.html"><span data-if="hdevelop" style="display:inline">pose_to_hom_mat3d</span><span data-if="c" style="display:none">pose_to_hom_mat3d</span><span data-if="cpp" style="display:none">PoseToHomMat3d</span><span data-if="com" style="display:none">PoseToHomMat3d</span><span data-if="dotnet" style="display:none">PoseToHomMat3d</span><span data-if="python" style="display:none">pose_to_hom_mat3d</span></a></code>, 
<code><a href="hom_mat3d_to_pose.html"><span data-if="hdevelop" style="display:inline">hom_mat3d_to_pose</span><span data-if="c" style="display:none">hom_mat3d_to_pose</span><span data-if="cpp" style="display:none">HomMat3dToPose</span><span data-if="com" style="display:none">HomMat3dToPose</span><span data-if="dotnet" style="display:none">HomMat3dToPose</span><span data-if="python" style="display:none">hom_mat3d_to_pose</span></a></code>, 
<code><a href="caltab_points.html"><span data-if="hdevelop" style="display:inline">caltab_points</span><span data-if="c" style="display:none">caltab_points</span><span data-if="cpp" style="display:none">CaltabPoints</span><span data-if="com" style="display:none">CaltabPoints</span><span data-if="dotnet" style="display:none">CaltabPoints</span><span data-if="python" style="display:none">caltab_points</span></a></code>, 
<code><a href="gen_caltab.html"><span data-if="hdevelop" style="display:inline">gen_caltab</span><span data-if="c" style="display:none">gen_caltab</span><span data-if="cpp" style="display:none">GenCaltab</span><span data-if="com" style="display:none">GenCaltab</span><span data-if="dotnet" style="display:none">GenCaltab</span><span data-if="python" style="display:none">gen_caltab</span></a></code>, 
<code><a href="calibrate_hand_eye.html"><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></a></code>
</p>
<h2 id="sec_references">References</h2>
<p>

K. Daniilidis: “Hand-Eye Calibration Using Dual Quaternions”;
International Journal of Robotics Research, Vol. 18, No. 3,
pp. 286-298; 1999.
<br>
M. Ulrich, C. Steger: “Hand-Eye Calibration of SCARA Robots Using Dual
Quaternions”; Pattern Recognition and Image Analysis, Vol. 26, No. 1,
pp. 231-239; January 2016.

</p>
<h2 id="sec_module">模块</h2>
<p>
Calibration</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
